pthreads:使用 while 循环进行pthread_cond_wait背后的逻辑

Pthreads: The Logic Behind Using While Loops for pthread_cond_wait

本文关键字:wait cond 背后 pthread 使用 while 循环 pthreads      更新时间:2023-10-16

我很难理解为什么使用 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(和就绪条件(;

这就是我通常如何看待示例中列出的 pthreads 框架。我的问题是 while 循环是如何有效的。当我尝试跟踪逻辑时,我得到以下步骤:

  1. 主集是准备加载为 true
  2. X 对于工作线程中的 while(x( 不再为真
  3. 因此,while 循环被断开,这意味着 pthread_cond_wait(&readyCondition, &loadLock( 被绕过,永远不会收到信号

显然,我的逻辑在某个地方是有缺陷的,但我不确定我应该如何思考这个问题,并希望得到任何澄清。

pthread_cond_wait存在

,以便工作线程将丢弃loadingLock锁并在条件isReadyToLoad == true尚未满足时进入睡眠状态。因此,如果在工作线程到达 while 循环之前已经满足条件,则根本不需要进入 while 循环并运行pthread_cond_wait

请记住,您处于多线程环境中,这意味着发生的顺序可能会以不可预测的方式变化。一种可能的情况是,工作线程在主线程将isReadyToLoad设置为 true 之前到达 while 循环。因此,工作人员必须调用pthread_cond_wait并等待,直到主服务器实际将isReadyToLoad设置为 true 并调用pthread_cond_signal来唤醒工作人员。

就像Jesper Juhl所说,虚假的唤醒有时可能会没有任何理由地发生。在这种情况下,工人醒来,看到条件仍然不满意,然后再次进入睡眠状态。