c++ - Boost::Thread/C++11 std::thread,想要在条件下唤醒工作线程

标签 c++ multithreading boost c++11

我正在使用 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 时进入休眠状态。问题是存在竞争条件。这是一个示例情况:

  1. 工作线程计算 if(a == b),发现它为真。
  2. 主线程更改 a 和/或 b,使它们不再相等。在工作线程上调用 notify_one()。
  3. 工作线程忽略 notify_one(),因为它仍然处于唤醒状态。
  4. 工作线程进入休眠状态。 死锁

如果我可以避免使用条件变量会更好,因为我实际上不需要锁定任何东西。但是只需让工作线程在 a == b 时进入休眠状态,并在 a != b 时唤醒。有办法做到这一点吗?

最佳答案

看来您没有正确同步您的访问:当您在工作线程中读取 ab 时,您至少需要获取一个锁,在访问与生产者共享的值时:由于工作线程持有锁,因此 ab 都不能被主线程更改。如果它们不相等,工作线程可以释放锁并停止处理这些值。如果它们相等,则工作线程将 wait() 放在条件变量上 while 锁定!条件变量的主要功能是自动释放锁并进入休眠状态。

当主线程更新a 和/或b 时,它获取锁,进行更改,释放锁并通知工作线程。工作线程显然没有持有锁,但在下一次检查到期时或作为通知的结果获得它,检查值的状态和 wait() 或处理值(value)观。

正确完成后,就不会出现竞争条件!

我错过了你的关键困惑:“因为我实际上不需要锁定任何东西”!好吧,当你有两个线程可以同时访问同一个值,并且至少其中一个正在修改该值时,如果没有同步,你就会发生数据竞争。任何有数据竞争的程序都有未定义的行为。换句话说:即使您只想将一个 bool 值从一个线程发送到另一个线程,您也确实需要同步。同步不必采用锁的形式(例如,可以使用原子变量来同步值),而是进行重要的通信,例如,涉及两个 int 而不仅仅是一个原子通常很难!您几乎肯定想要使用锁。然而,您可能还没有发现这种深切的渴望。

关于c++ - Boost::Thread/C++11 std::thread,想要在条件下唤醒工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182542/

相关文章:

c++查找 vector 中元素的实际数量

c++ - 为什么这个循环会破坏数组?

multithreading - 为什么线程中断方法没有中断其 sleep 方法?

java - 退出线程时如何执行代码

c++ - 为什么在 boost python vector 索引套件中需要比较运算符?

c++ - C++ 中 lhs 和 rhs 区别的引用

c++ - 无法链接 libtiff

c - Solaris 线程的最大数量

c++ - 如何确保始终为特定 C++ 实例返回相同的 Python 实例?

c++ - 迭代超出范围,并且 "one more"