在等待唤醒之前发生通知吗?

时间:2016-02-15 14:10:51

标签: c++ multithreading condition-variable happens-before

这个程序

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之前完成,在这种情况下永远不会有唤醒)。所以,我认为(使用任何内存顺序)都不需要使用锁定防护来取消注释。

0 个答案:

没有答案