C のマルチスレッド ロックとその使用方法
マルチスレッド プログラムを作成する場合、データのセキュリティを確保し、競合状態を回避するために、ロックを使用する必要があります。ロックは、特定のコード ブロックを同時に 1 つのスレッドのみで実行できるようにする同期メカニズムです。 C では、選択できるロックの種類が数多くありますが、より一般的に使用されるものは、ミューテックス ロック、読み取り/書き込みロック、条件変数です。この記事では、これらのロックの基本的な概念や使い方、注意点などを紹介します。
Mutex (ミューテックス)
ミューテックス ロックは、共有リソースを保護し、同時に 1 つのスレッドのみがアクセスできるようにするためによく使用されます。 1 つのスレッドがロックを保持している場合、ロックを保持したい他のスレッドは待機する必要があります。スレッドがロックを解放すると、他のスレッドが共有リソースにアクセスできるようになります。
C におけるミューテックス ロックの定義は次のとおりです。
#include <mutex> std::mutex mutex;
ミューテックス ロックの使用方法は通常次のとおりです。
// 线程1 mutex.lock(); // 访问共享资源 mutex.unlock(); // 线程2 mutex.lock(); // 访问共享资源 mutex.unlock();
使用する場合は注意が必要です。ミューテックス ロック 常にロックとロック解除を使用する必要があります。そうしないと、デッドロックが発生する可能性があります。また、他のスレッドの実行に影響を与えないように、長時間ロックを占有することは避けてください。
リーダー/ライター ロック
リード/ライター ロックは、複数のスレッドが同時に共有リソースを読み取ることを許可しますが、共有リソースへの書き込みを許可するのは 1 つのスレッドのみである特殊なロックです。スレッドが共有リソースに書き込むと、書き込み操作が完了するまで他のスレッドは読み書きできず、読み取りスレッドは読み取りを続行できません。読み取り/書き込みロックの定義は次のとおりです。
#include <shared_mutex> std::shared_mutex rw_mutex;
読み取り/書き込みロックの使用方法は次のとおりです。
// 写入线程 rw_mutex.lock(); // 写入共享资源 rw_mutex.unlock(); // 读取线程 rw_mutex.lock_shared(); // 读取共享资源 rw_mutex.unlock_shared();
読み取り/書き込みロックを使用する場合、優先順位が異なることに注意してください。書き込み操作が長時間ロックを占有することを避けるために、共有リソースを読み取るスレッドに を与える必要があります。
条件変数
条件変数は通常、スレッド間の同期と通信に使用されます。これは、待機メカニズムと通知メカニズムを通じてスレッド間の調整を実現できる、ミューテックス ロックに基づく同期メカニズムです。
条件変数の定義は次のとおりです:
#include <condition_variable> std::condition_variable cond_var;
条件変数は通常、ミューテックス ロックと一緒に使用されます。待機およびウェイクアップのプロセスは次のとおりです:
// 线程1 std::unique_lock<std::mutex> lock(mutex); cond_var.wait(lock); // 唤醒后执行的代码 // 线程2 std::unique_lock<std::mutex> lock(mutex); // 执行唤醒操作 cond_var.notify_one();
It条件を使用する場合は、変数を使用するときに最初にロックする必要があることに注意してください。ロックしないとデッドロックが発生する可能性があります。
概要
マルチスレッド プログラミングでは、ロックは不可欠な同期メカニズムです。ロックを選択するときは、データのセキュリティとスレッドの調整をより確実に行うために、さまざまなロックの特性と使用シナリオを考慮する必要があります。ロックの使用に関する基本原則、つまりきめ細かな制御とデッドロックの回避を思い出してください。
以上がC++ のマルチスレッド ロックとその使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。