c++ - 这种 boost 条件代码的使用有问题吗?

标签 c++ boost synchronization conditional-statements

此代码是否会在生产者的 void push(data) 中等待互斥量?

如果是这样,我该如何解决?

boost::mutex access;
boost::condition cond;

// consumer
data read()
{
  boost::mutex::scoped_lock lock(access);

  // this blocks until the data is ready
  cond.wait(lock);

  // queue is ready
  return data_from_queue();
}

// producer
void push(data)
{
  //<--- will a block ever happen here?
  boost::mutex::scoped_lock lock(access);
  // add data to queue

  cond.notify_one();  
}

假设我有一个线程池 for(;;) 循环,我从这个池中的线程调用了 read() 。然后我处理上面的数据。我用一些外部线程调用 push() 。我的问题是,该外部线程是否会阻塞其对 push(data) 的调用?

最佳答案

wait 可以在不调用 notify 的情况下返回。这称为 spurious wakeup .为处理此问题,使用条件的代码应始终围绕 wait 进行循环,以检查预期条件是否确实有效。例如:

queue data_queue;
boost::mutex access;
boost::condition cond;

// consumer
data read()
{
  boost::mutex::scoped_lock lock(access);

  while (queue.is_empty()) {
    // this blocks until the data is ready
    cond.wait(lock);
  }

  // queue is ready
  return data_from_queue();
}

// producer
void push(data)
{
  boost::mutex::scoped_lock lock(access);

  // add data to queue
  queue.push_back(data);

  cond.notify_one();  
}

从概念上讲,“条件”有点误导。相反,您可以将其视为一个信号。您正在向另一个或多个线程发出唤醒信号,但您没有 promise 任何事情。只是,“嘿,也许有一些数据准备好了,你为什么不去看看呢?”

关于c++ - 这种 boost 条件代码的使用有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1033981/

相关文章:

c++ - 与 Qt 项目的静态链接

c++ - boost::thread join 中的 EXC BAD ACCESS

java - 如何让notify()在wait()之前执行,我尝试使用sleep()但仍然不起作用

Netbeans 设置同步

c++ - 在单独的文件夹中生成依赖文件

c++ - 线程同步问题

c++ - 如何在不需要实时的情况下制作时隙(只是模拟)

c++ - 如何使用 boost.lambda 和 boost.range 从容器中进行选择?

c++ - Boost - 仅当大小匹配时反序列化数组

algorithm - 与中央服务器同步联系人列表