假设我有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;我试图确定一个没有做出这种保证的具体实施是否正确。
答案 0 :(得分:1)
是的,如果条件变量上的B和C都被阻塞,并且条件变量上没有其他线程被阻塞,那么保持互斥锁两次调用pthread_cond_signal()
可以保证(最终)将它们唤醒。
这直接来自POSIX中的要求:
pthread_cond_signal()
函数应至少解锁其中一个 在指定条件变量cond
上被阻塞的线程 (如果在cond
上阻止了任何线程)。
对pthread_cond_signal()
的第一次调用必须取消阻止B和C中的至少一个,因为这些是条件变量上阻塞的唯一线程。因为互斥量仍然由信令线程保持,所以在第二次调用pthread_cond_signal()
之前没有其他线程可以阻塞条件变量,所以剩下的一个在B和C之外(如果其中只有一个被第一个阻塞呼叫)必须被第二次呼叫解锁。