我是条件变量,多线程和互斥的新手,对此我有一个基本问题。
在wait_for上从 en.cppreference.com 引用-“阻塞当前线程,直到唤醒条件变量或在指定的超时时间之后”。。
为什么在指定的持续时间后应解除当前线程的阻塞。条件变量的基本目的是在“条件”发生时进行通知。如果每500毫秒唤醒一次线程,是否不会引起开销?伪造的唤醒也作为一种安全机制而内置,以防呼叫通知没有发生/失败等。
我在这里显然缺少基本的东西,但不确定是什么。任何帮助表示赞赏。
答案 0 :(得分:2)
这种情况的用例是,如果您想等待事件发生,但不是无限期地。
也许超时到期后,您想通知用户获取结果花费的时间比预期的长。也许您想触发提供结果的任务的取消。
正如您正确指出的那样,这会导致额外的开销,因此,只有在您确实有合理的措施应对过期的超时时,才使用wait
代替。
虚假唤醒并不是安全机制,而是某些硬件体系结构带来的不幸需求。在一个完美的世界(即,您只用谓词调用wait
函数的世界)中,永远不会发生虚假的唤醒。
答案 1 :(得分:0)
如果线程每500毫秒被唤醒一次?
wait_for
的工作方式不是这样。让我们暂时忽略虚假的唤醒。当收到通知或计时器到期时,该功能将唤醒。另一种查看方式:等待通知,但不要超过rel_time
时间。
例如,当通知机制崩溃时,它可以用于避免无限等待。或者,如果通知还不够到时您需要采取措施。
杂散唤醒是现代软件/硬件体系结构现实的有害副作用。 This answer解释得很好。