条件変数は、notify()
とunlock_sleep()
(mutexがロックされておらず、スレッドが1つのアトミックシーケンスの操作としてスリープするwait()
の範囲内で使用される仮想関数呼び出し)に対して1つの順序を持つ必要があります。 std::condition_variable_any
実装は、通常、内部で別のミューテックスを使用して、任意のlockablesでこれを達成するために内部unlock_sleep()
とnotify()
(notify_one()
またはnotify_all()
)の操作は、あなたがスレッドを危険にさらす互いに関してアトミックでない場合libC++ std :: condition_variable_anyの実装
(原子性を確保するとの上で寝るために)ミューテックスのロックを解除し、別のスレッドのシグナリングを行い、元のスレッドがスリープ状態になり、スリープ状態になることはありません。
私はのlibstdC++とのlibcのstd :: condition_variable_anyの++実装を読み、this code in the libc++ implementation
{lock_guard<mutex> __lx(*__mut_);}
__cv_.notify_one();
内部ミューテックスがロックされ、その後すぐに信号操作の前にアンロックされて気づきました。私は上記の問題を危険にさらしていませんか?
libstdc++ seems to have gotten this right
私は 'unlock_sleep()'に慣れていません。ドキュメントへのリンクを提供できますか?また、 'notify()'によって 'notify_one()'または 'notify_all()'のどちらかを意味しますか? –
@MichaelBurr申し訳ありませんが、私はスリープ状態になり、ミューテックスを1つのアトミック操作としてロック解除するという一般的な操作を意味していました。 – Curious