我试图了解在发出 condvar 信号后我有什么保证。
我相信基本的使用模式是这个(伪代码):
消费者线程:
Mutex.Enter()
while(variable != ready)
Condvar.Wait()
Mutex.Exit()
生产者线程:
Mutex.Enter()
variable = ready
Condvar.Broadcast()
[Unknown?]
Mutext.Exit()
我的问题是。我对上面代码中的 [Unknown] 点有什么保证?我仍然持有互斥体,但我能知道消费者的什么状态?
从手册页中,我不清楚生产者在广播/发出信号之后和释放互斥量之前处于什么状态。
最佳答案
来自 condition vars :
pthread_cond_wait() 阻塞调用线程,直到发出指定条件的信号。这个例程应该在互斥锁被锁定时调用,它会在等待时自动释放互斥锁。接收到信号,线程被唤醒后,mutex会自动锁定,供线程使用。程序员然后负责在线程完成时解锁互斥锁。
因此,当生产者执行未知部分代码时,生产者持有互斥锁,而消费者被锁定在互斥锁上,直到生产者释放它。
关于linux - Condvar 行为在信号之后,但在互斥体释放之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557876/