【发布时间】:2013-11-25 08:00:03
【问题描述】:
我使用 Boost::thread 作为工作线程。我想在没有工作要做的时候让工作线程进入睡眠状态,一旦有工作要做就唤醒它。我有两个保存整数的变量。当整数相等时,没有工作要做。当整数不同时,有工作要做。我当前的代码如下所示:
int a;
int b;
void worker_thread()
{
while(true) {
if(a != b) {
//...do something
}
//if a == b, then just waste CPU cycles
}
}
//other code running in the main thread that changes the values of a and b
我尝试使用条件变量并在 a == b 时让工作线程进入睡眠状态。问题是存在竞争条件。这是一个示例情况:
- 工作线程评估 if(a == b),发现它为真。
- 主线程更改 a 和/或 b 使得它们不再相等。在工作线程上调用 notify_one()。
- 工作线程忽略 notify_one(),因为它仍然处于唤醒状态。
- 工作线程进入睡眠状态。 死锁
如果我可以避免条件变量会更好,因为我实际上不需要锁定任何东西。但是只要让工作线程在 a == b 时进入睡眠状态,并在 a != b 时唤醒。有没有办法做到这一点?
【问题讨论】:
-
“因为我实际上不需要锁定任何东西”......我相信这被称为“乐观并发”。
标签: c++ multithreading boost c++11