代码之家  ›  专栏  ›  技术社区  ›  MMMMMCK

Pthreads:为pthread\u cond\u wait使用While循环背后的逻辑

  •  1
  • MMMMMCK  · 技术社区  · 6 年前

    我很难理解为什么在pthread\u cond\u wait中使用while循环。让我们举一个简单的例子。以下是一些工作线程:

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

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

    1. 将isReadyToLoad设置为true
    2. pthread\u cond\u信号(&readyCondition);

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

    1. Master将isReadyToLoad设置为true
    2. 当(X)在工作线程中时,X不再为真
    3. 因此,while循环被中断,这意味着pthread\u cond\u wait(&readyCondition,&loadingLock)被绕过,永远不会收到信号

    很明显,我的逻辑在某个方面存在缺陷,但我不确定我应该如何考虑这一点,如果有任何澄清,我将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  3
  •   ctring    6 年前

    pthread_cond_wait 是否存在使工作线程将丢弃 loadingLock 锁定并进入睡眠状态 isReadyToLoad == true 尚未满足。因此,如果在工作线程到达while循环之前条件已经满足,则无需进入while循环并运行 pthread\u cond\u等待 完全

    请记住,您处于多线程环境中,这意味着发生的顺序可能会以不可预测的方式发生变化。一种可能的情况是,工作线程在主线程设置之前到达while循环 isReadyToLoad 为真。因此,工人必须致电 pthread\u cond\u等待 然后等到主人真的 isReadyToLoad 至true和calls pthread_cond_signal 唤醒工人。

    正如杰斯珀·尤尔所说,有时会无缘无故地发生虚假的觉醒。在这种情况下,工人醒来,发现条件仍然不满足,然后再次入睡。