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

时间:2015-04-20 21:20:33

标签: 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个等待线程将被解除阻塞吗?

我没有任何特定的用例依赖于此(如果排队多个任务并希望确保多个工作线程唤醒以处理它们,它可能会有用吗?)但是我&# 39;我试图确定一个没有做出这种保证的具体实施是否正确。

1 个答案:

答案 0 :(得分:1)

是的,如果条件变量上的B和C都被阻塞,并且条件变量上没有其他线程被阻塞,那么保持互斥锁两次调用pthread_cond_signal()可以保证(最终)将它们唤醒。

这直接来自POSIX中的要求:

  

pthread_cond_signal()函数应至少解锁其中一个   在指定条件变量cond上被阻塞的线程   (如果在cond上阻止了任何线程)。

pthread_cond_signal()的第一次调用必须取消阻止B和C中的至少一个,因为这些是条件变量上阻塞的唯一线程。因为互斥量仍然由信令线程保持,所以在第二次调用pthread_cond_signal()之前没有其他线程可以阻塞条件变量,所以剩下的一个在B和C之外(如果其中只有一个被第一个阻塞呼叫)必须被第二次呼叫解锁。