この番組か
std::condition_variable cond_var;
std::mutex mtx;
std::atomic<int> value {0};
const auto mem_ord = std::memory_order_seq_cst;
std::thread notify_thread([&]
{
{
//std::unique_lock<std::mutex> lock (mtx);
value.store (1, mem_ord);
}
cond_var.notify ();
});
{
std::unique_lock<std::mutex> lock (mtx);
cond_var.wait (lock, [&] { return value.load (mem_ord) != 0; });
}
notify_thread.join ();
終了することが保証されているか、デッドロックする可能性がありますか? を使用するとどうなりますmem_ord = std::memory_order_relaxed
か?store
に-ing している間、ロックを保持する他の理由はありatomic<int>
ますか? cppreference.comは、 のロックガードのある行のコメントを外す必要があることを要求していnotify_thread
ます。
(任意のメモリ順序で)通知store
の前に発生し、 の(潜在的な)ウェイクアップの前に発生しwait
、の前に発生することを期待しますload
。notify-thread
(もちろん、条件変数の前に終了する可能性があるため、「潜在的なウェイクアップ」と言いwait
ます。その場合、ウェイクアップはありません)。したがって、(メモリの順序に関係なく)ロックガードのある行のコメントを外す必要はないと思います。