有一个Producer和n个消费者。 生产者我们将n个作业分配给n个消费者并调用pthread_cond_wait()n次以等待消费者完成分配的作业。 消费作业后,每个消费者都会调用pthread_cond_signal()来通知生产者。
我的问题是“消费者对pthread_cond_signal()的调用是否会使生产者从pthread_cond_wait()中退出n次?或者是否存在多个信号合并为单个信号以便pthread_cond_wait()出现的情况比n次?
答案 0 :(得分:0)
如果生产者在消费者线程调用pthread_cond_wait()
时实际上没有在pthread_cond_signal()
的调用内等待,那么该信号将“丢失”(即,如果生产者线程稍后进入pthread_cond_wait()
,它将阻止,直到发送另一个信号。)
这就是为什么条件变量必须与保持与条件变量一起使用的互斥锁时检查的其他“布尔谓词”一起使用的原因。该谓词是关于决定是否等待的线程是否应该等待的实际最终决定。谓词是最后一个词的另一个原因是pthread_cond_wait()
中被阻止的线程可能被虚假唤醒。
来自POSIX docs on pthread_cond_wait()
:
使用条件变量时,总会有一个布尔谓词 涉及与每个条件等待关联的共享变量 如果线程应继续,则为true。来自的虚假唤醒 可能会发生pthread_cond_timedwait()或pthread_cond_wait()函数。 从pthread_cond_timedwait()或pthread_cond_wait()返回 并不意味着关于这个谓词的价值, 应该在返回时重新评估谓词。