gpt4 book ai didi

c++ - 如果被虚假唤醒,消费者线程是否会收到 condition_variable 通知信号

转载 作者:行者123 更新时间:2023-11-30 02:25:41 31 4
gpt4 key购买 nike

我们知道条件变量容易被虚假唤醒。假设我们有一个与互斥锁和条件变量同步的 1-producer-1-consumer 队列。消费者线程被虚假唤醒。问题是——消费者线程是否会错过来自生产者的通知信号?我知道这是极不可能的..但是这样的实现是否仍然有可能丢失队列中的最后一个元素?

最佳答案

如果调用 wait() 的代码编写不正确,它确实可能会错过唤醒。但这有点反常。通常的成语是:

lock the mutex
while the condition is not satisfied
wait on the condition variable

发信号的线程应该在发信号之前锁定互斥体:

lock the mutex
signal the condition variable

等待条件变量会在等待期间解锁互斥量。但是,当 wait 调用返回时,互斥量将被锁定。因此,在虚假唤醒时,等待线程将持有互斥锁,直到它恢复等待。当等待线程持有互斥锁时,发信号的线程不能发信号给条件变量。当等待线程实际等待时,互斥锁被解锁,发信号的线程可以继续发信号;等待线程将获得信号,一旦信号线程释放互斥锁,等待线程将恢复执行。

所以,不,正确的代码不会错过信号。但是如果等待线程在检查其条件的过程中释放互斥量并重新获取它,则信号可能在等待线程调用 wait 之前发生,并且信号将丢失。不要那样做。

关于c++ - 如果被虚假唤醒,消费者线程是否会收到 condition_variable 通知信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43954396/

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