关于这个: 如何使用条件变量
假设我们有多个执行此类代码的消费者线程(从引用的页面复制):
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);
}
我假设这里的场景是:主线程调用 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)
那时就会满足。我正确吗?)