C コードで非同期プログラミングを実行するにはどうすればよいですか?
ソフトウェア開発の分野において、非同期プログラミング(Asynchronous Programming)は必須スキルの1つとなっています。 CPU 集中型の操作と IO 集中型の操作のパフォーマンスのバランスをより適切に調整できるため、プログラム コードを同時または並列で実行できるため、プログラムの応答速度と全体的なパフォーマンスが向上します。現在、非同期プログラミングは多くのプラットフォームやプログラミング言語で広く使用されています。 C 言語の非同期プログラミング モードは、高性能プログラミング言語として、多くのプロジェクトで広く使用されています。この記事では、皆さんが非同期プログラミングをマスターできるように、C言語による非同期プログラミングの手法を紹介します。
C 11 の非同期プログラミング手法
C 11 標準では、非同期プログラミング用に std::async が導入されました。 std::async 関数は、新しいスレッドを開始し、非同期計算の結果を表す std::future オブジェクトを返すために使用されます。関数の定義は次のようになります:
template< class Function, class... Args > future<typename result_of<Function(Args...)>::type> async( launch policy, Function&& f, Args&&... args );
このうち、パラメータポリシーは起動戦略であり、オプションは std::launch::async と std::launch::deferred で、前者は非同期で起動することを意味します非同期計算を開始します。パラメータ f は実行される関数または関数オブジェクトです。パラメータ args は関数または関数オブジェクトのパラメータです。
非同期プログラミングに std::async を使用するサンプル コードは次のとおりです。
#include <iostream> #include <future> #include <chrono> #include <thread> using namespace std; int async_func(int x, int y) { cout << "async_func start." << endl; std::this_thread::sleep_for(std::chrono::seconds(1)); cout << "async_func end." << endl; return x + y; } int main() { std::future<int> result = std::async(std::launch::async, async_func, 1, 2); cout << "main func start." << endl; std::this_thread::sleep_for(std::chrono::seconds(2)); cout << "main func end." << endl; int res = result.get(); cout << "result: " << res << endl; return 0; }
このコードでは、std::async を使用して非同期計算スレッドを開き、async_func 関数を実行します。パラメータ x と y の値をそれぞれ 1 と 2 として渡し、最終的に計算結果を返します。メインスレッドでは、まず 2 秒間停止し、非同期計算スレッドが終了した後に計算結果を取得して出力しました。
上記のコードを実行すると、出力結果は次のようになります。
async_func start. main func start. async_func end. main func end. result: 3
出力結果から、非同期計算処理中にメインスレッドはブロックされませんが、ブロックされることがわかります。後続のコードの実行を続行します。また、非同期計算中にプログラムが例外をスローした場合、その例外を処理しないとプログラムがクラッシュすることに注意してください。
C のタイマー非同期プログラミング メソッド
C では、非同期プログラミングに std::async を使用するだけでなく、非同期プログラミングにシステムのタイマーを使用するなど、他の非同期プログラミング メソッドも提供しています。タイマーはオペレーティング システムの一般的なメカニズムであり、イベントをトリガーしたり、定期的にタスクを実行したりするために使用されます。 C では、以下に示すように、std::chrono および std::thread ライブラリの関連関数を使用してタイマー非同期プログラミングを実装できます。
#include <iostream> #include <chrono> #include <thread> void timer_func() { std::cout << "timer func called." << std::endl; } int main() { int delay_time = 200; std::chrono::milliseconds delay(delay_time); while(true) { std::cout << "wait for " << delay_time << " milliseconds." << std::endl; std::this_thread::sleep_for(delay); timer_func(); } return 0; }
このサンプル プログラムでは、std::this_thread を使用します。 ::sleep_for 関数は 20 ミリ秒の遅延をシミュレートし、遅延が終了した後に timer_func 関数がトリガーされ、タイマーの非同期プログラミングが実現されます。上記のコードを実行すると、ターミナル上で待ち時間を継続的に出力することができ、定期的に「timer func call.」が出力されます。
タイマーの精度とパフォーマンスは、オペレーティング システムの負荷、システム時間の精度など、さまざまな要因の影響を受けやすいことに注意してください。したがって、実際のアプリケーションでは、特定のリアルタイム要件がある場合は、いくつかの最適化と調整を行う必要があります。
結論
非同期プログラミングは、ソフトウェア開発において必要なスキルの 1 つになりました。 C 言語では、std::async やシステム タイマーなどのメカニズムを使用して非同期プログラミングを実装できます。実際のプログラミングでは、非同期プログラミングを使用すると、マルチコア CPU をより効果的に利用でき、コードの並列性または同時実行性のパフォーマンスが向上し、コードの応答時間が短縮されます。本稿では非同期プログラミングの基礎知識を紹介するだけで、実際のアプリケーションはマルチスレッド機構やスレッド同期機構などの技術を用いて完成させる必要があります。実際のアプリケーションでは、プログラム エラーやパフォーマンスの問題を回避するために、関連テクノロジをある程度深く理解し、習得する必要があります。
以上がC++ コードで非同期プログラミングを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。