gpt4 book ai didi

c++ - std::condition_variable wait() 和 notify_one() 同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:47 28 4
gpt4 key购买 nike

前言:我在这里看到过类似的问题,但似乎没有一个能回答我的问题。

是否有可靠的方法来确保消费者线程中的 wait() 方法在生产者线程的第一个 notify_one() 调用之前被调用?

即使在消费者线程中使用unique_lock,也有可能生产者线程会先运行,锁定互斥量并在消费者调用之前调用notify() wait(),因此,我的应用程序将缺少第一个 notify() 调用。

编辑:感谢您的所有回答,它们确实帮助了我。我的问题是这个消费者循环中的第一个 wait-notify():

while (!timeToQuit) {
gdcv.wait(gdcondlock);
gdlock.lock();
//spurious wakeup
if (gdQueue.empty()) {
gdlock.unlock();
continue;
}
//some work here
gdlock.unlock();
}

我想我必须为第一个循环迭代编写额外的代码。

EDIT2:这个循环和第二个锁(unique_lock btw)在那里是因为有多个生产者和消费者访问队列。

EDIT3:在 boost::lockfree::queue 的帮助下等待这个特定线程的正确方法,以防有人遇到类似问题:

  nfq_data* data;
while (!timeToQuit) {
gdcv.wait(gdlock,[&]{return !gdQueue.empty() || timeToQuit;});
gdQueue.pop(data);
gdlock.unlock();
}

最佳答案

Even with unique_lock in consumer thread there is a possibility that producer thread will run first, lock the mutex and call noify() before consumer calls wait(), therefore, my app will be missing first nofity() call.

要么消费者需要等待,要么没有。如果它有什么要等待的,那就没有问题。如果它没有任何等待,不要调用 wait。真的就是这么简单。

当且仅当您想要等待时调用wait

条件变量的存在是为了解决如何释放锁并等待的问题,而不必冒等待已经发生的事情的风险。他们通过提供一个自动释放锁并等待的函数来解决这个问题。他们不会错过唤醒,因为他们在决定 sleep 时持有锁。

关于c++ - std::condition_variable wait() 和 notify_one() 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33824499/

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