0

有 1 个生产者和 n 个消费者。生产者我们将 n 个作业分配给 n 个消费者,并调用 pthread_cond_wait() n 次以等待消费者完成分配的作业。每个 Consumer 消费完作业后调用 pthread_cond_signal() 通知生产者。

我的问题是“消费者对 pthread_cond_signal() 的 n 次调用是否会使生产者从 pthread_cond_wait() 中退出 n 次?或者是否存在将多个信号合并为单个信号以使 pthread_cond_wait() 出现少于 n 次的情况?

4

1 回答 1

0

如果生产者实际上并没有在调用内部等待pthread_cond_wait()消费者线程调用pthread_cond_signal(),那么该信号将“丢失”(即,如果生产者线程稍后滚动到pthread_cond_wait(),它将阻塞,直到发送另一个信号)。

这就是为什么条件变量必须与其他一些“布尔谓词”一起使用,这些“布尔谓词”在持有与条件变量一起使用的互斥锁时进行检查。该谓词是决定是否等待的线程是否应该等待的实际最终决定。谓词是最终决定的另一个原因是阻塞的线程pthread_cond_wait()可以被虚假唤醒。

来自POSIX 文档pthread_cond_wait()

当使用条件变量时,总是有一个布尔谓词涉及与每个条件相关联的共享变量等待如果线程应该继续,则该条件等待为真。可能会发生来自 pthread_cond_timedwait() 或 pthread_cond_wait() 函数的虚假唤醒。由于 pthread_cond_timedwait() 或 pthread_cond_wait() 的返回并不意味着该谓词的任何值,因此应在此类返回时重新评估谓词。

于 2013-03-20T07:17:46.967 回答