考虑以下条件变量的简单示例:
bool pause = true;
boost::mutex::scoped_lock lock(m_mutex);
while (!pause) cv.wait(lock);
和
boost::mutex::scoped_lock lock(m_mutex);
pause = false;
cv.notify_one();
如果我们在支持字节粒度更新的处理器上运行代码,那么我们本质上是否需要scoped_lock
或任何其他锁。这实质上意味着bool的赋值是原子的,这通常是x86处理器的情况。
当两个线程在两个不同的处理器上运行并且具有单独的缓存时,它是否与变量的同步有关?
答案 0 :(得分:2)
是的,使用原子是不够的。
效率的CV可以被虚假地唤醒,那些虚假的查找(或类似的问题)可能导致错过写入。
想象一下虚假的醒来。接收线程检查bool,什么也看不见(false),然后被抢占。有人通知所有人并设置bool。通知被丢弃,因为接收线程已经处理了一个。接收线程现在完成,并且错过了该消息。
现在,在发件人中添加一个锁,该锁在设置bool之后和cv通知之前重叠一些时间序列。这个沟通洞已不复存在。
(即使没有虚假的唤醒,多次通知有时会导致类似的问题。)
您在通知时不必持有锁(事实上这是一种悲观),但一般情况下,锁必须在写后保留并预先通知一段时间。