2016-01-21 16 views
6

は、私は私がこれをで行うことができない理由をC++ 14(または17)条件変数と共有ミューテックス

std::shared_timed_mutex mutex; 
std::unique_lock<std::shared_timed_mutex> lock(mutex); 

std::condition_variable var; 

while(!some_condition) 
    var.wait(lock); 

条件変数のみSTDで動作するように見えるだろう::ミューテックス。しかし、なぜ?

+0

あなたのユースケースを共有することはできますか? – inf

+0

これは素晴らしいことですが、上記のように「書き込みロック」された 'shared_timed_mutex'を待つことができるだけでなく、' shared_lock'を使って「読み込みロック」されている間待つこともできます。ライタースレッドが情報を公開して公開できるようになるまで待つ必要があるかもしれません。 –

+0

ユースケースは少し複雑です:グローバル(現在は)読み取り/書き込みロックを持つデータストアがあります。また、オブジェクトごとにロックします。 オブジェクトを取得する場合は、まずグローバルロックをロックし、オブジェクトを取得し、オブジェクトをロックしてグローバルロックを解放します。 オブジェクトが削除される場合があります。だから、私はオブジェクトのロックを待ってはいけません(そのロックも破棄されるので)代わりに何かが変わったときに目を覚ますスレッドを起こす条件変数があります。 最高のデザインではないかもしれませんが、デッドロックがなく、メモリをあまり使用しません。 –

答えて

9

これは、実装の効率を最大限にするために標準によって定義されています。 condition_variableで別のロックを使用する場合は、condition_variable_anyを使用する必要があります。ただし、condition_variable_any実装には若干のオーバーヘッドがあります。標準から

引用:30.5条件変数

クラスcondition_variableのみ は、いくつかのプラットフォーム上で最大 effciencyが可能、タイプunique_lock<mutex>の対象に待つことができる条件変数を提供します。

+0

ありがとうございました!私はこれが存在するのを知らなかった! –

+0

@ T.C。ありがとう、ちょうどその仕事をする方法を見つけることを試みていた:) – inf

関連する問題