コンピューターのハードウェアのパフォーマンスが継続的に向上するにつれて、マルチコア処理に対する人々のニーズはますます高まっています。同時に、最新のオペレーティング システムでは同時プログラミングのサポートもますます完全になり、プログラミング分野で同時プログラミングが不可欠な部分になっています。これに関連して、C は広く使用されている高性能プログラミング言語として、多くの強力な同時プログラミング ツールとライブラリも提供します。
この記事では、C 同時プログラミングの基本的な概念とテクニックをいくつか紹介し、簡単なサンプル コードを通じてその使用法を示します。
マルチスレッドの基本
マルチスレッドは、プログラムが複数の命令ストリームを同時に実行できるようにする、一般的に使用される同時プログラミング モデルです。 C では、標準ライブラリの
#include <iostream> #include <thread> void hello() { std::cout << "Hello" << std::endl; } int main() { std::thread t(hello); t.join(); return 0; }
このコードは、文字列「Hello」を出力する hello という名前の関数を定義します。 main 関数では、プログラムは新しいスレッド t を作成し、スレッドの実行関数として hello 関数を使用します。 t.join() ステートメントは、スレッドの実行が完了するのを待ってからプログラムを終了します。
ミューテックス ロック
複数のスレッドが同時に実行されるため、同じ共有リソースに同時にアクセスされる可能性があります。現時点では、常に 1 つのスレッドだけが共有リソースにアクセスできるようにするメカニズムが必要です。このメカニズムはミューテックス ロックです。
C では、標準ライブラリの e517c9ed30f2300c1c910dc75c8db2c8 ヘッダー ファイルを使用して、ミューテックス ロックを実装できます。以下は、ミューテックス ロックを使用する簡単なコード例です。
#include <iostream> #include <thread> #include <mutex> std::mutex m; int sum = 0; void add() { m.lock(); sum += 1; m.unlock(); } int main() { std::thread t1(add); std::thread t2(add); t1.join(); t2.join(); std::cout << "sum = " << sum << std::endl; return 0; }
このコードは、グローバル変数の合計を 1 増やす add という名前の関数を定義します。 main 関数では、プログラムは 2 つの新しいスレッド t1 と t2 を作成し、その実行関数として add 関数を使用します。 sum は共有リソースであるため、sum へのアクセスがスレッドセーフであることを保証するために、add 関数でミューテックス ロック m が使用されます。
アトミック操作
アトミック操作は、ロックせずに共有リソースを更新または読み取りできる特別な操作です。 C では、標準ライブラリの 15a199175b5d79b4bf26b73c4a2287fc ヘッダー ファイルを使用してアトミック操作を実装できます。以下は、アトミック操作を使用した簡単なコード例です。
#include <iostream> #include <thread> #include <atomic> std::atomic<int> sum(0); void add() { sum += 1; } int main() { std::thread t1(add); std::thread t2(add); t1.join(); t2.join(); std::cout << "sum = " << sum << std::endl; return 0; }
このコードは、初期値が 0 である sum という名前のアトミック変数を定義します。 add 関数では、アトミック操作 sum = 1 を使用して sum の値を 1 増やします。 main 関数では、プログラムは 2 つの新しいスレッド t1 と t2 を作成し、その実行関数として add 関数を使用します。 sum はアトミック変数であるため、アトミック操作 sum = 1 でスレッドの安全性を保証できます。
概要
この記事では、マルチスレッド、ミューテックスロック、アトミック操作など、C での同時プログラミングの基本を紹介します。もちろん、C は、条件変数、セマフォ、スレッド プールなど、これらよりもはるかに多くの同時プログラミング ツールとライブラリを提供します。実際のプロジェクトでは、プログラムの正確性を確保し、プログラムのパフォーマンスと保守性を向上させるために、適切な同時プログラミング ツールとライブラリを選択することが非常に重要です。
以上がC++ での同時プログラミングに関する予備調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。