如果我向条件变量发出 N 次信号,它会解除 N 个线程的阻塞吗?

If I signal a condition variable N times, will it unblock N threads?

假设我有 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 中剩下的一个(如果只有其中一个被第一个解除阻塞)呼叫)必须被第二个呼叫解锁。