Pthreads:pthread_cond_wait使用while循环的逻辑

时间:2018-03-07 07:43:32

标签: c++ multithreading pthreads logic

我在解决为什么while循环用于pthread_cond_wait时遇到了一些麻烦。我们举一个简单的例子。这是一些工人主题:

pthread_mutex_lock (&loadingLock);
while (isReadyToLoad == false){
    pthread_cond_wait(&readyCondition, &loadingLock);
} 
pthread_mutex_unlock (&loadingLock);

所以,现在主线程做了两件事:

  1. 将isReadyToLoad设置为true
  2. 调用pthread_cond_signal(安培; readyCondition);
  3. 这就是我通常看到示例中列出的pthreads框架的方式。我的问题是while循环是如何有效的。当我尝试跟踪逻辑时,我得到以下步骤:

    1. Master sets isReadyToLoad为true
    2. 对于工作线程中的while(x),X不再为真
    3. 因此,while循环被打破,意味着绕过pthread_cond_wait(& readyCondition,& loadingLock)并且永远不会收到信号
    4. 显然,我的逻辑在某个方面存在缺陷,但我不确定我应该如何考虑这一点,并希望得到任何澄清。

1 个答案:

答案 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所说,虚假的唤醒有时可能会毫无理由地发生。在这种情况下,工作人员醒来,发现情况仍然不满意,然后又重新入睡。