rac*_*cic 2 c mutex pthreads condition-variable
关于这个: 如何使用条件变量
假设我们有许多执行此类代码的消费者线程(从引用的页面复制):
while (TRUE) {
s = pthread_mutex_lock(&mtx);
while (avail == 0) { /* Wait for something to consume */
s = pthread_cond_wait(&cond, &mtx);
}
while (avail > 0) { /* Consume all available units */
avail--;
}
s = pthread_mutex_unlock(&mtx);
}
Run Code Online (Sandbox Code Playgroud)
我假设这里的场景是:主线程调用pthread_cond_signal()来告诉消费者线程做一些工作.
据我所知 - 后续线程调用pthread_mutex_lock()然后调用pthread_cond_wait()(以原子方式解锁互斥锁).到目前为止,没有任何消费者线程声称使用互斥锁,它们都在pthread_cond_wait()上等待.
当主线程调用pthread_cond_signal()时,在联机帮助页之后,至少会唤醒一个线程.当它们中的任何一个从pthread_cond_wait()返回时,它会自动声明互斥锁.
所以我的问题是:现在关于提供的示例代码会发生什么?也就是说,失去互斥体竞赛的线程现在做了什么?
(AFAICT赢得互斥锁的线程,应该运行其余的代码并释放互斥锁.丢失的那个应该等待互斥锁 - 在第一个嵌套 while循环中的某个地方- 而胜利者持有它并且在它被释放之后在pthread_cond_wait()上开始阻塞,因为while (avail == 0)那时将满足.我是否正确?)
注意,pthread_cond_signal()通常只是为了唤醒一个等待的线程(这就是它保证的全部).但它可能会"意外地"唤醒.所述while (avail > 0)循环执行两个功能:
它还可以防止在while (avail > 0)完成后工作单元可能已经放入队列的竞争条件,但是在工作线程再次等待条件之前 - 但是该竞争也在if调用之前由测试处理pthread_cond_wait().
基本上当一个线程被唤醒时,它只知道可能有工作单元供它使用,但可能没有(另一个线程可能已经消耗它们).
所以pthread_cond_signal()调用时发生的事件序列是:
while (avail > 0)循环中执行工作,然后将释放互斥锁