コンピュータ技術の継続的な発展に伴い、マルチコア プロセッサとマルチスレッド プログラミングはますます重要かつ一般的なテクノロジになりました。広く使用されているオブジェクト指向プログラミング言語である C には、マルチスレッド プログラミングの実現において独自の利点があります。この記事では、C を使用してスレッドの作成、同期、相互排他などのスレッド プログラミングを実装する方法を紹介します。
1. スレッドの基本概念
スレッドはプロセスの基本的な実行単位であり、プロセスには複数のスレッドを含めることができます。スレッドには次の特性があります。
(1) スレッドはプロセスの一部であるため、プロセスのメモリ空間を共有します。
(2) スレッドを並行して実行できるため、プログラムの実行効率が向上します。
(3) データはスレッド間で共有できますが、データ競合の問題にも直面します。
(4) スレッドは独立した実行プロセスを持ち、独自のスタックやレジスタなどを持つことができます。
2. スレッドの作成
C はスレッドを作成するためのさまざまなメソッドを提供しますが、最も一般的に使用されるメソッドはスレッド クラスを使用することです。
(1) スレッド オブジェクトの作成
スレッド クラスのコンストラクターを使用して、次のコードのようにスレッド オブジェクトを作成します。
#include <iostream> #include <thread> void func() { std::cout << "hello from thread" << std::endl; } int main() { std::thread t(func); t.join(); return 0; }
上記のコードでは、 func 関数はスレッド化されています。 関数を実行するには、std::thread t(func) を使用してスレッド オブジェクトを作成し、メイン関数で t.join() を呼び出してスレッドを実行し、スレッドが実行を完了するまで待機します。プログラムを終了します。
(2) パラメータを渡す
スレッドでパラメータを渡す必要がある場合は、次のコードのように、スレッド オブジェクトの作成時にパラメータを渡すことができます。 ##上記のコードでは、func 関数に int 型のパラメータ num があり、スレッド オブジェクトの作成時にパラメータ 3 が渡されます。
3. スレッドの同期
複数のスレッドが同時に実行されると、データの競合やデッドロックなどの問題が発生する可能性があります。これらの問題を回避するには、スレッド同期の概念を導入する必要があります。
(1) Mutex
Mutex は最も一般的に使用されるスレッド同期メカニズムであり、複数のスレッドが同時に共有リソースにアクセスすることを防ぎます。 C は、次のコードのようなミューテックスを実装するための std::mutex クラスを提供します。
#include <iostream> #include <thread> void func(int num) { std::cout << "hello from thread " << num << std::endl; } int main() { std::thread t(func, 3); t.join(); return 0; }
上記のコードでは、mtx.lock() と mtx.unlock() はそれぞれミューテックスのロックとロック解除に使用されます。 。 量。ミューテックスは func 関数と main 関数の両方で、出力ステートメントをロックおよびロック解除するために使用されます。これにより、出力ステートメントが指定された順序で実行されることが保証されます。
(2) 条件変数
条件変数は、実行を続行する前に特定の条件が満たされるのを待つために使用できるスレッド同期メカニズムです。 C では、次のコードのような条件変数を実装するための std::condition_variable クラスが提供されています。
#include <iostream> #include <mutex> #include <thread> std::mutex mtx; void func() { mtx.lock(); std::cout << "hello from thread" << std::endl; mtx.unlock(); } int main() { std::thread t(func); mtx.lock(); std::cout << "hello from main" << std::endl; mtx.unlock(); t.join(); return 0; }
上記のコードでは、cv.wait(ul) は、条件変数フラグが満たされるまで待機するために使用されます。実行を継続するには、 cv.notify_one () を使用して、条件変数を待機しているスレッドに通知します。 func2 関数で flag を true に設定し、条件変数のリセットを待機しているスレッドに通知します。
4. 概要
この記事では、C を使用してスレッドの作成、同期、相互排他などのスレッド プログラミングを実装する方法を紹介します。この記事を学習すると、ミューテックスや条件変数などのスレッド同期メカニズムを使用して、複数のスレッドが同時に実行されるときに発生する可能性のある問題を回避する方法がわかります。
以上がC++ を使用してスレッド プログラミングを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。