我了解如何使用条件变量(这个构造的糟糕名称,IMO,因为 cv 对象既不是变量也不是表示条件)。所以我有一对线程,用 Boost.Thread规范地设置为:
bool awake = false;
boost::mutex sync;
boost::condition_variable cv;
void thread1()
{
boost::unique_lock<boost::mutex> lock1(sync);
while (!awake)
cv.wait(lock1);
lock1.unlock(); // this line actually not canonical, but why not?
// proceed...
}
void thread2()
{
//...
boost::unique_lock<boost::mutex> lock2;
awake = true;
lock2.unlock();
cv.notify_all();
}
我的问题是:thread2 真的需要保护对 的分配awake
吗?在我看来,这个notify_all()
电话应该就足够了。如果被操作和检查的数据不仅仅是一个简单的“可以继续”标志,我会看到互斥锁中的值,但在这里看起来有点过头了。
第二个问题是代码片段中提出的问题:为什么 Boost 文档没有显示线程 1 中的锁在“处理数据”步骤之前被解锁?
编辑:也许我的问题真的是:有没有比简历更干净的结构来实现这种等待?