gpt4 book ai didi

c++ - 条件变量 "miss"可以通知调用吗?

转载 作者:行者123 更新时间:2023-11-30 03:21:59 25 4
gpt4 key购买 nike

我想知道条件变量是否有可能“错过”通知调用。我的场景如下。

给定一个互斥体 mu 和一个 Pred P (!queue.empty())...

线程 A:在程序的整个生命周期内持续存在。持有等待 mu 和 P 的条件变量。在获取 mu 并验证队列不为空时,它将从队列中弹出一个项目。

线程 B:一个函数,将获取 mu,推送到队列。

线程 C:与 B 相同。

线程 B 和 C 同时生成。

在这种情况下,B 首先获取 mu,推送到队列,丢弃 mu 并调用通知。在 B 调用 notify 和丢弃 mu 之间,C 获取 mu,推送到队列,然后调用 notify。最后 A 获取 mu,继续从队列中弹出一个项目并处理它。但是,A 仅对其中一个通知调用起作用。

如果您尝试一个接一个地处理队列中的项目,这似乎会造成堆积。

这种情况会发生吗?我们必须意识到这一点吗?例如,在 A 中,pop UNTIL 队列为空?或者这是由语言处理的?

最佳答案

If you are trying to process the items in the queue one by one, this seems to create a pile up.

Is this a situation that can occur? And do we have to be aware of it? For example, within A, pop UNTIL the queue is empty? Or is this handled by the language?

是的,这是一种可能发生的情况,您应该意识到这一点。在您描述的场景中,等待可能唤醒一次(队列中有两个项目)、两次(队列中每个项目一次)甚至 N 次(队列中没有任何项目的虚假唤醒。这就是为什么您总是唤醒后检查您的谓词,然后在重新等待条件之前确保谓词为假。弹出直到队列为空是一个合理的解决方案。

关于c++ - 条件变量 "miss"可以通知调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51638715/

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