gpt4 book ai didi

c++ - boost::condition::notify_all 是否保证监听器线程在返回之前将获取锁?

转载 作者:行者123 更新时间:2023-11-30 02:02:09 27 4
gpt4 key购买 nike

boost::condition cond;
boost::mutex access;
void listener_thread()
{
boost::mutex::scoped_lock lock(access);

while (true) {
while (!condition_check_var) {
cond.wait(lock);
}
do_some_work();
}
}

/// ... Main thread ...
cond.notify_all();
check_work:
{
boost::mutex::scoped_lock lock(access);
function_relies_on_work_been_done();
}

这是正确的设计吗?可以安全地假设一旦 notify_all() 返回,listener_thread 就已经获得了锁吗?当 check_work block 运行时(因为它锁定了与 listener_thread() 相同的互斥体),一些“工作”已经由 完成listener_thread()?

如果不是,实现这种行为的首选方法是什么?

最佳答案

无法保证任何其他线程已根据通知采取行动,甚至尚未收到通知。事实上,甚至不能保证当前有一个线程在等待接收,尽管在您的设置中看起来很可能有线程在等待。如果您想确保接收线程已完成其工作,则需要设置反向通信 channel ,例如,使用另一个条件变量和合适的条件。

我知道您的问题是关于 Boost 的,但这是标准对此的说明(30.5.1 [thread.condition.condvar] 第 8 段):

void notify_all() noexcept; Effects: Unblocks all threads that are blocked waiting for *this.

它不保证线程和/或任何涉及的互斥体会发生什么。

关于c++ - boost::condition::notify_all 是否保证监听器线程在返回之前将获取锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556763/

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