这个程序
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
进入atomic<int>
时,是否有任何其他原因可以锁定? cppreference.com要求必须使用notify_thread
中的锁定防护线取消注释。
我希望(在任何内存顺序下)store
发生在通知之前,发生在之前(潜在)唤醒wait
,发生在<{em> load
之前。 (我说&#34;潜在的唤醒&#34;因为notify-thread
当然可以在条件变量wait
之前完成,在这种情况下永远不会有唤醒)。所以,我认为(使用任何内存顺序)都不需要使用锁定防护来取消注释。