なぜlock_guard
が存在するのか混乱しています。それ:lock_guardによって遅く実行できるタスクにunique_lockを使用していますか?
unique_lock
より簡単なインターフェイスですか?unique_lock
よりもパフォーマンスが優れていますか?- 他に何かありますか?
なぜlock_guard
が存在するのか混乱しています。それ:lock_guardによって遅く実行できるタスクにunique_lockを使用していますか?
unique_lock
より簡単なインターフェイスですか?unique_lock
よりもパフォーマンスが優れていますか?lock_guard
は、ロックされたMutex
タイプへのポインタまたは参照を1つの状態単位で実装できます。
unique_lock
はその状態を保持し、かつunique_lock
がロックされていないMutex
を持つことができるよう、現在、をロックされている場合を知るために両方があります。つまり、余分な状態の少なくともbool
が必要です。
lock_guard
はMutex
を取得し解放周りゼロオーバーヘッドRAIIロック/アンロックラッパーを提供します。基本的にlock_guard
は、RAIIを使用してMutex
のロックを処理することを避ける理由がないことを意味します。
unique_lock
は、コンパイラがlock_guard
が使用できる方法でしか使用できないことに気付くことができる場合(すなわち、構築してから、破壊することなく)ゼロオーバーヘッドに達することができます。
lock_guard
と表示されるプログラマーは、効率の議論を超えて、スコープ内のコードを調べることなくスコープの終わりまで持続することを知っています。 unique_lock
と表示されているプログラマは、変数が使用されているかどうかを知るために変数の使用方法をすべて調べなければなりません。
しかし、これは理由の半分に過ぎません。
もう1つの理由の半分は、C++ 11のスレッディングライブラリの多くが、プラットフォームのほとんどが独立したスレッドライブラリをすでに実装していたboost
ライブラリに基づいているためです。 Boostはlock_guard
とunique_lock
の両方を持ち、C++ 11バージョンとほとんど同じセマンティクスを持っています。
のでboost
スレッドライブラリが標準化されたとき、両方の場所で行われ、誰もがそれらを排除しません。
ほとんどあなた自身の質問に答えてください - 1)と2)両方とも良い理由です。 std::lock_guardは、シンプルスコープロックオブジェクトです。ミューテックス取得時のタイムアウトなどの機能は、ミューテックスプリミティブの複雑さを増し、操作を実行するのにかかる時間とミューテックスの競合確率の両方を増加させます。だから、あなたが必要としないものをなぜ払うのですか?
タイムアウトを伴うまたは伴わないかどうか「try_lockingは」良いデザインであるが、別の質問です。 C++ 11が実装していない壊れたデザインのような、スレッドキャンセルのようなものです。