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

时间:2018-12-11 10:34:40

标签: c++ c++11 condition-variable

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

在wait_for上从 en.cppreference.com 引用-“阻塞当前线程,直到唤醒条件变量或在指定的超时时间之后”。

为什么在指定的持续时间后应解除当前线程的阻塞。条件变量的基本目的是在“条件”发生时进行通知。如果每500毫秒唤醒一次线程,是否不会引起开销?伪造的唤醒也作为一种安全机制而内置,以防呼叫通知没有发生/失败等。

我在这里显然缺少基本的东西,但不确定是什么。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

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

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

正如您正确指出的那样,这会导致额外的开销,因此,只有在您确实有合理的措施应对过期的超时时,才使用wait代替。

虚假唤醒并不是安全机制,而是某些硬件体系结构带来的不幸需求。在一个完美的世界(即,您只用谓词调用wait函数的世界)中,永远不会发生虚假的唤醒。

答案 1 :(得分:0)

  

如果线程每500毫秒被唤醒一次?

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

例如,当通知机制崩溃时,它可以用于避免无限等待。或者,如果通知还不够到时您需要采取措施。

杂散唤醒是现代软件/硬件体系结构现实的有害副作用。 This answer解释得很好。