2010-11-20 14 views
3

mutexロックを最初に取得することなく、boost :: condition_variableを「待機」することは可能ですか?それに失敗した場合、これは何とかpthreadのlibを直接使って行うことができますか?boost :: condition_variableロックなしで待機する

簡単にするために、OSレイヤ(Linuxのfutexなど)に直接行かないようにしたいと思います。しかし、私はmutex呼び出しのオーバヘッドも望んでいません。

通常の状況下でこれを行う競合状態をよく知っています。私は別の方法でそれをカバーしている。

+0

boost :: condition_variableの使用パターンを見ると、実際には意味をなさないミューテックスなしで使用されます。入力時に、waitメソッドはミューテックスを原子的にロック解除し、スレッドを待ち行列に追加し、後でミューテックスがロックされたときにロックします。 –

答えて

6

どちらの場合も、最初にミューテックスを取得する必要があります。

boost.threadsドキュメントから:

無効 待機(後押し:: unique_lockのを& ロック)

前提条件:ロックが 現在のスレッドによってロックされている[...]

pthread_cond_wait manページ:

pthread_cond_waitの()と pthread_cond_timedwaitは()関数は、条件変数でブロックするために使用 あります。 これらは、呼び出し元スレッド によってロックされたmutexで呼び出されます。または、定義されていない の動作はとなります。

私には何の選択肢もありません。

+0

このシステムではまったく問題ありません。私は別のものを探す必要があります。 –

0

いいえ、そうではありません。 condition_variable API仕様からわかるように、常にunique_lockにロック可能なパッケージが用意されている必要があります。しかし、私は本当にどこに問題があるか分かりません。このコンストラクトは、何らかの種類のシンクロナイゼーションオブジェクトなしでは実行できない "モニタ"を実装します。

関連する問題