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