c - 如果我向一个条件变量发出 N 次信号,它会解锁 N 个线程吗?

标签 c multithreading pthreads posix

假设我有 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 variable cond (if any threads are blocked on cond).

第一次调用 pthread_cond_signal() 必须至少解除 B 和 C 之一的阻塞,因为它们是条件变量上阻塞的唯一线程。由于互斥量仍然由信号线程持有,因此在第二次调用 pthread_cond_signal() 之前,没有其他线程可以阻塞条件变量,因此 B 和 C 中的剩余一个(如果只有其中之一)被第一个调用解除阻止)必须通过第二个调用解除阻止。

关于c - 如果我向一个条件变量发出 N 次信号,它会解锁 N 个线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758627/

相关文章:

c - 轮询和选择之间有什么区别?

c++ - 涉及逻辑与 (&&) 的复杂表达式

c - 如何在单独的线程中传递 blt vector

c - 日志线程的奇怪行为

multithreading - MPI和pthreads : nodes with different numbers of cores

c - 线程创建过程中程序执行的流程

c - strcmp 问题

c++ - 有没有一种方法可以将 Qt 中的信号设为 `eat`?

c - 下面的代码有什么问题?预期 X 由线程 Func 1 修改,随后 X 由线程 Func 2 修改

c - 编写返回 char 数组的 C 函数的正确方法是什么?