web-dev-qa-db-ja.com

条件変数、ミューテックス、ロックの違い

たとえば、 c ++ 0x interfaces

これら(cv、mutex、lock)のどれを使用するかを判断するのに苦労しています。誰でもリソースを説明したり指摘したりできますか?

前もって感謝します。

46
Ronny Brendel

参照するページで、「mutex」は実際の低レベル同期プリミティブです。ミューテックスを取得してから解放すると、一度に1つのスレッドのみがそれを取得できます(そのため、同期プリミティブです)。再帰的ミューテックスはsameスレッドで複数回取得できるもので、他の人が取得できるようになるまで同じスレッドで何度も解放する必要があります。

ここでの「ロック」は、コンストラクターでミューテックスを取得し、デストラクタでリリースするC++ラッパークラスです。 C++スコープの同期を確立するのに役立ちます。

条件変数は、ロックと「シグナリング」メカニズムを組み合わせた、同期プリミティブのより高度な/高レベルの形式です。リソースが利用可能になるのをスレッドが待機する必要がある場合に使用されます。スレッドはCVで「待機」でき、リソースプロデューサーは変数に「シグナル」を送信できます。この場合、CVを待機するスレッドは通知を受け、実行を継続できます。ミューテックスはCVと組み合わされて、スレッドがCVで待機を開始し、別のスレッドがCVにシグナルを送信するという競合状態を回避します。信号が配信されるか失われるかは制御できません。

68
Antti Huima

私はC++ 0xにはあまり馴染みがないので、この答えに一粒の塩を取ります。

re:ミューテックスとロック:投稿したドキュメントから、mutexはOSミューテックスを表すオブジェクトであるように見えますが、lockはミューテックスを保持するオブジェクトです。 RAIIパターン

条件変数は、ブロッキング/シグナリングメカニズム(signal + wait)を相互排除メカニズムに関連付ける便利なメカニズムですが、システムプログラマーとしてcondvarとmutexの関連付けを選択できるように、OSでそれらを分離したままにします。 (同時にアクセスされるオブジェクトの複数のセットを処理するのに便利です)Rob Krtenは、彼の QNXの本 のオンライン章の1つに condvarsの良い説明 があります。

一般的な参照に関しては、 この本 (まだ出版されていません)は面白そうです。

5
Jason S