所以我刚刚发现,如果您没有在C++ 11中保存锁定,则发出一个条件变量的信号是合法的。这似乎打开大门,一些讨厌的竞争条件:无条件锁定的条件变量上的信号
std::mutex m_mutex;
std::condition_variable m_cv;
T1:
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait(lock, []{ return !is_empty(); });
T2:
generate_data();
m_cv.notify();
能够保证所有的T1将永远在我们检查is_empty(这种情况最终会)第(它返回true),然后让由T2抢占其创建一些数据并在实际等待之前发送条件变量的信号?
如果这是保证工作(我猜是这样,否则它看起来像一个故意的糟糕的API设计),这是如何实现的说linux和stdlibc++
?似乎我们需要另一个锁来避免这种情况。
是的,这是一个竞争条件的精确配方,就像http://stackoverflow.com/q/20982270/412080 –