我在解决为什么while循环用于pthread_cond_wait时遇到了一些麻烦。我们举一个简单的例子。这是一些工人主题:
pthread_mutex_lock (&loadingLock);
while (isReadyToLoad == false){
pthread_cond_wait(&readyCondition, &loadingLock);
}
pthread_mutex_unlock (&loadingLock);
所以,现在主线程做了两件事:
这就是我通常看到示例中列出的pthreads框架的方式。我的问题是while循环是如何有效的。当我尝试跟踪逻辑时,我得到以下步骤:
显然,我的逻辑在某个方面存在缺陷,但我不确定我应该如何考虑这一点,并希望得到任何澄清。
答案 0 :(得分:2)
pthread_cond_wait
是这样的,工作线程将丢弃loadingLock
锁,并在条件isReadyToLoad == true
尚未满足时进入休眠状态。因此,如果在工作线程到达while循环之前已经满足条件,那么就不需要进入while循环并运行pthread_cond_wait
。
请记住,您处于多线程环境中,这意味着发生的事情的顺序可能会以不可预测的方式发生变化。一种可能的情况是,在主线程可以将isReadyToLoad
设置为true之前,工作线程到达while循环。因此,工作人员必须调用pthread_cond_wait
并等待主人实际将isReadyToLoad
设置为true并调用pthread_cond_signal
以唤醒工作人员。
像Jesper Juhl所说,虚假的唤醒有时可能会毫无理由地发生。在这种情况下,工作人员醒来,发现情况仍然不满意,然后又重新入睡。