使用带有条件变量的锁

时间:2016-09-22 06:59:32

标签: c++ multithreading boost condition-variable

考虑以下条件变量的简单示例:

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处理器的情况。

当两个线程在两个不同的处理器上运行并且具有单独的缓存时,它是否与变量的同步有关?

1 个答案:

答案 0 :(得分:2)

是的,使用原子是不够的。

效率的CV可以被虚假地唤醒,那些虚假的查找(或类似的问题)可能导致错过写入。

想象一下虚假的醒来。接收线程检查bool,什么也看不见(false),然后被抢占。有人通知所有人并设置bool。通知被丢弃,因为接收线程已经处理了一个。接收线程现在完成,并且错过了该消息。

现在,在发件人中添加一个锁,该锁在设置bool之后和cv通知之前重叠一些时间序列。这个沟通洞已不复存在。

(即使没有虚假的唤醒,多次通知有时会导致类似的问题。)

您在通知时不必持有锁(事实上这是一种悲观),但一般情况下,锁必须在写后保留并预先通知一段时间。

相关问题