gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:12 27 4
gpt4 key购买 nike

此代码是否会在生产者的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com