C でのスレッド間通信の方法には、共有メモリ、同期メカニズム (ミューテックス ロック、条件変数)、パイプライン、およびメッセージ キューが含まれます。たとえば、ミューテックス ロックを使用して共有カウンタを保護します。ミューテックス ロック (m) と共有変数 (counter) を宣言し、各スレッドがロック (lock_guard) によってカウンタを更新するようにします。競合状態を防ぐため。
マルチスレッド アプリケーションでは、スレッドが相互に通信してタスクを調整し、データを共有できる必要があります。 C は、スレッド間通信を実装するためのさまざまなメカニズムを提供します。
共有メモリを使用すると、複数のスレッドが同じメモリ領域にアクセスできます。これはオーバーヘッドの低いアプローチですが、競合状態を避けるために注意する必要があります。
int shared_data = 0; void thread_1() { shared_data++; // 可能会被其他线程同时访问 } void thread_2() { shared_data++; // 可能会同时导致不正确的结果 }
同期メカニズムは、共有リソースにアクセスするときにスレッドを調整するために使用できます。
ミューテックス ロックは相互排他的アクセスを提供し、一度に 1 つのスレッドのみが共有リソースにアクセスできるようにします。
std::mutex m; void thread_1() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 // 访问共享资源 } void thread_2() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 // 访问共享资源 }
条件変数を使用すると、スレッドは特定の条件が満たされるまで待機できます。
std::condition_variable cv; std::mutex m; void producer() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 while (!condition) { // 等待条件满足 cv.wait(l); } // 生产数据 } void consumer() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 condition = true; cv.notify_all(); // 唤醒所有等待线程 }
パイプラインは、2 つのスレッド間でデータを送信するために使用される一方向通信メカニズムです。
std::pipe pipe; void writer() { std::string message = "hello"; std::write(pipe[1], message.c_str(), message.length()); } void reader() { std::string message; std::read(pipe[0], message.data(), message.size()); }
Message Queue は、非同期メッセージ配信メカニズムを提供します。
key_t key = ftok("message_queue", 'a'); int message_queue = msgget(key, IPC_CREAT | 0666); void sender() { Message msg; msg.mtext = "hello"; msgsnd(message_queue, &msg, sizeof(msg.mtext), IPC_NOWAIT); } void receiver() { Message msg; msgrcv(message_queue, &msg, sizeof(msg.mtext), 0, 0); }
実際的なケース: ミューテックスを使用して共有カウンターを保護する
複数のスレッドによって同時に更新する必要がある共有カウンターがあるとします。ミューテックスを使用してこのカウンタを保護できます。
std::mutex m; int counter = 0; void thread_1() { for (int i = 0; i < 1000000; i++) { std::lock_guard<std::mutex> l(m); counter++; } } void thread_2() { for (int i = 0; i < 1000000; i++) { std::lock_guard<std::mutex> l(m); counter--; } }
これにより、常に 1 つのスレッドだけがカウンタを更新できるようになり、競合状態が防止されます。
以上がC++ 同時プログラミング: スレッド間通信を処理するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。