【问题标题】:Number of pthread_cond_signal()s and pthread_cond_wait()s mis/matchpthread_cond_signal()s 和 pthread_cond_wait()s 错误/匹配的数量
【发布时间】:2013-03-20 06:03:23
【问题描述】:
有一个生产者和n个消费者。
生产者我们将 n 个作业分配给 n 个消费者,并调用 pthread_cond_wait() n 次以等待消费者完成分配的作业。
每个Consumer消费完job后调用pthread_cond_signal()通知producer。
我的问题是“消费者对 pthread_cond_signal() 的 n 次调用是否会使生产者从 pthread_cond_wait() 中退出 n 次?或者是否存在将多个信号合并为单个信号以减少 pthread_cond_wait() 出现的情况超过n次?
【问题讨论】:
标签:
variables
pthreads
conditional-statements
【解决方案1】:
如果生产者在消费者线程调用pthread_cond_signal() 时实际上并没有在调用pthread_cond_wait() 中等待,那么该信号将“丢失”(即,如果生产者线程稍后滚动到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() 返回
并不暗示这个谓词的价值,
谓词应在返回时重新评估。