C++でmutexを使用する方法は何ですか?
C++では、mutex(相互排他ロック)がスレッドの同期を実現するために使用され、スレッド間の競合状態(race condition)を回避します。mutexはいつでも共有リソースにアクセスできるのは1つのスレッドのみであることを保証しています。以下はmutexの主な使い方です:
- ミューテックスの作成と初期化:
- std::mutex mtx; // mutexオブジェクトを作成
- ロックとアンロックの排他的なロック。
- ロック:mutexをロックするためにlock()関数を使用します。もし他のスレッドによってmutexがすでにロックされている場合、現在のスレッドはブロックされ、mutexがアンロックされるまで待機します。mtx.lock(); // mutexをロックする
- 解除ロック:mutexをアンロックするためにunlock()関数を使用します。mtx.unlock(); // mutexをアンロック
- 互斥ロックの自動的なロックとアンロック:
どの状況でも適切に互斥ロックをアンロックするために、std::lock_guardクラスを使用することができます。std::lock_guardは構築時に自動的にロックをかけ、スコープの終了時に自動的に解除します。 - std::mutex mtx;// スコープ終了時に自動的にアンロックされる
{
std::lock_guard lock(mtx);
// クリティカルセクションのコード
} // スコープ終了、ミューテックスが自動的にアンロック - try_lock()関数を使用して排他的なロックを試みることができます。この関数は、他のスレッドがすでにロックしている場合、ロックを試みて失敗し、すぐにfalseを返します。ロックがまだされていない場合は、ロックを試みて成功し、trueを返します。
- もし (mtx.try_lock()) {
// ミューテックスのロックに成功した場合
// クリティカルセクションのコード
mtx.unlock(); // ミューテックスのアンロック
} else {
// ミューテックスのロックに失敗した場合
}
前述は、相互排他ロックの最も一般的な使い方です。相互排他ロックの適切な使用により、複数のスレッド環境で共有リソースに安全にアクセスすることが保証されます。