条件变量中 wait_for 函数的用途 - C++11

Posted

技术标签:

【中文标题】条件变量中 wait_for 函数的用途 - C++11【英文标题】:purpose for wait_for function in condition variable - C++11 【发布时间】:2018-12-11 10:34:39 【问题描述】:

我是条件变量、多线程和互斥锁的新手,对此我有一个基本问题。

来自 en.cppreference.com on wait_for 的引述 - “阻塞当前线程,直到条件变量被唤醒或在指定的超时持续时间之后”

为什么要在指定的持续时间后解除当前线程的阻塞。条件变量的基本目的是在“条件”发生时进行通知。如果线程被唤醒,例如,每 500 毫秒,它不会导致开销吗?虚假唤醒也被内置为一种安全机制,以防通知调用未发生/失败等。

我显然在这里遗漏了一些基本的东西,但不确定它是什么。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

这种情况的用例是如果您想等待事件发生,但不是无限期地。

可能在超时后,您想通知用户获取结果的时间比预期的要长。也许您想触发取消提供结果的任务。

正如您正确指出的那样,这会导致额外的开销,因此只有在您确实有一些合理的事情可以对过期超时做出反应时,才有意义使用它而不是 wait

虚假唤醒与其说是一种安全机制,不如说是某些硬件架构强加的不幸必要性。在一个完美的世界中(即一个您只使用谓词调用 wait 函数的世界),永远不会发生虚假唤醒。

【讨论】:

【参考方案2】:

如果线程被唤醒,比如说,每 500 毫秒?

wait_for 不是这样工作的。让我们暂时忽略虚假唤醒。该函数将在收到通知或计时器到期时唤醒。另一种看待它的方式:等待通知,但不超过rel_time时间。

当通知机制可能崩溃时,它可以用来避免无限等待。或者,如果通知没有及时到来,您需要采取行动。

虚假唤醒是现代软件/硬件架构现实的不良副作用。 This answer 解释的很好。

【讨论】:

以上是关于条件变量中 wait_for 函数的用途 - C++11的主要内容,如果未能解决你的问题,请参考以下文章

conditon_variable(条件变量)用于线程间同步

C++ std::condition_variable wait() wait_for() 区别 怎么用 实例

Python asyncio condition 中 wait_for 方法的简单使用

C++11 future.wait_for() 总是返回 future_status::timeout

Python3 asyncio:wait_for()通信()超时,如何获得部分结果?

c拾遗-二级指针数组内函数