C++ の非同期プログラミング手法

王林
リリース: 2023-08-22 16:24:26
オリジナル
1354 人が閲覧しました

C++ の非同期プログラミング手法

C は、さまざまな種類のアプリケーション、特により複雑に動作するアプリケーションやシステム リソースに対する要求が高いアプリケーションで広く使用されている人気のあるプログラミング言語です。したがって、近年の C 開発では非同期プログラミング手法がますます重要になっています。この記事では、C を非同期プログラミングに使用する方法を検討します。

非同期プログラミングの背景

退屈で時間のかかる一部のタスクについては、同期プログラミング モデルではニーズを満たすことができません。オペレーティング システムは、システム リソースをより多く使用するために、これらのタスクを非同期モードに設定することがよくあります。効率的に。 。非同期プログラミング モデルを使用すると、プログラムは前のタスクの完了を待たずに複数のタスクを並行して実行できます。これは、プログラムの全体的なパフォーマンスの向上に役立ちます。

非同期プログラミングのヒント

C で非同期プログラミングを行う場合は、非同期ライブラリを使用する必要があります。その中で、C 11 標準には、メインスレッド以外のスレッドで関数を実行できる非同期ライブラリ std::async が含まれています。 std::async 関数を使用する具体的なプロセスは次のとおりです:

1. 非同期タスク: std::future オブジェクトを作成します。

2. 非同期タスクで関数を実行するには、 std::async 関数を使用して関数とパラメーターを指定します。

3. メイン スレッドで他のタスクを実行し、結果を取得する前に非同期タスクが完了するのを待ちます。

以下はサンプル コードです:

//ヘッダー ファイルをインクルード

include

include

//非同期タスク
int foo(int x) {

return x * x; 
ログイン後にコピー

}

//メイン関数
int main() {

//创建异步任务 
std::future<int> result = std::async(foo,2);

//在此期间执行其他任务 
std::cout << "Main Task Finished" << std::endl;

//等待异步任务完成 
int r = result.get();

//输出异步任务结果 
std::cout << "Result is " << r << std::endl;
ログイン後にコピー

}

メインスレッドで非同期タスクが完了するのを待っていると、メインスレッドがブロックされることに注意してください。したがって、次のように、 std::future_status 列挙型の 1 つである std::future_status::ready を使用して、非同期タスクが完了したかどうかを検出できます。

//非同期タスクが完了したかどうかを検出します。完了しました Complete
if (result.wait_for(std::chrono::seconds(0)) == std::future_status::ready) {

//异步任务已完成
ログイン後にコピー

}

Inさらに、std::promise と std::future を一緒に使用して、よりきめ細かい非同期プログラミングのニーズを満たすこともできます。たとえば、マルチスレッド プログラミングでは、他のタスクを実行する前に 1 つのスレッドが完了するまで待機する必要がある場合があります。このとき、std::promise と std::future を使用してセマフォ メカニズムを実装できます。 # #//ヘッダー ファイルをインクルード

include

include

include

include

//非同期タスク

void foo(std::promise& p) {

std::this_thread::sleep_for(std::chrono::seconds(2)); //模拟长时间的任务
p.set_value(); //使用set_value()将结果返回给主线程 
ログイン後にコピー

}

//メイン関数

int main () {

//创建promise对象 
std::promise<void> p; 

//获取future对象 
std::future<void> f = p.get_future();

//在单独的线程中运行异步任务 
std::thread t(foo, std::ref(p));

//在此期间执行其他任务
std::cout << "Main Task Started" << std::endl;

//等待异步任务完成 
f.wait();

//输出结果 
std::cout << "Main Task Finished" << std::endl;

//等待异步线程完成 
t.join();
ログイン後にコピー

}

この例では、std::promise を使用して、セマフォ値 (void) を非同期スレッドに送信します。非同期スレッドがタスクを完了した後、次を使用します。 set_value() 関数を使用してセマフォ値をメインスレッドに返します。メインスレッドは、実行を続行する前に、非同期スレッドが完了するまで待つ必要があります。

概要

非同期プログラミングは C プログラミングにおける重要なスキルであり、プログラム全体のパフォーマンスと同時実行性を向上させることができます。この記事では、C による非同期プログラミングの基本原理を紹介し、関連するコード例をいくつか示しました。プログラムのパフォーマンスを向上させたい場合、またはマルチスレッド プログラミングを実行する必要がある場合、非同期プログラミング スキルは習得する必要があるコア テクノロジの 1 つです。

以上がC++ の非同期プログラミング手法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート