假设我有 3 个线程,A B 和 C,一个名为 mutex 的 pthread_mutex_t 和一个名为 cond 的 pthread_cond_t。
线程 B 和 C 在调用 pthread_cond_wait(&cond, &mutex);
时阻塞.
线程 A 锁定互斥体,并调用 pthread_cond_signal(&cond);
在释放互斥体之前两次。
这能保证解除两个线程的阻塞吗?更一般地说,如果 N 个线程已经在等待条件变量,而 pthread_cond_signal 被调用 N 次,我可以假设至少 N 个等待线程将被解除阻塞吗?
我没有任何具体的用例来依赖于此(如果您对多个任务进行排队并希望确保唤醒多个工作线程来处理它们,也许它会很有用?),但我正在尝试确定不做出此保证的特定实现是否正确。
最佳答案
是的,如果 B 和 C 都在条件变量上被阻塞,并且没有其他线程在条件变量上被阻塞,则在持有互斥锁的情况下调用 pthread_cond_signal()
两次可以保证(最终)把他们俩吵醒。
这直接来自 POSIX 中的要求:
The
pthread_cond_signal()
function shall unblock at least one of the threads that are blocked on the specified condition variablecond
(if any threads are blocked oncond
).
第一次调用 pthread_cond_signal()
必须至少解除 B 和 C 之一的阻塞,因为它们是条件变量上阻塞的唯一线程。由于互斥量仍然由信号线程持有,因此在第二次调用 pthread_cond_signal() 之前,没有其他线程可以阻塞条件变量,因此 B 和 C 中的剩余一个(如果只有其中之一)被第一个调用解除阻止)必须通过第二个调用解除阻止。
关于c - 如果我向一个条件变量发出 N 次信号,它会解锁 N 个线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758627/