为什么在等待条件变量时需要while循环

Met*_*est 16 c linux signals pthreads

说你有这个代码

pthread_mutex_lock(&cam->video_lock);
while(cam->status == WAIT_DISPLAY) // <-- Why is this a 'while' and not an 'if'?
    pthread_cond_wait(&cam->video_cond, &cam->video_lock);
pthread_mutex_unlock(&cam->video_lock);
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么你需要一个while循环.pthread_cond_wait不会等到信令线程发出信号cam_video_cond吗?好的,我知道你可能有一个情况,当调用pthread_cond_wait时,cam- > status不等于WAIT_DISPAY,但是在这种情况下你可以通过if条件而不是while来检查它.

我在这里错过了什么吗?我对pthread_cond_wait的理解是,如果没有发信号通知cam_video_cond,它只是等待无限.此外,它在调用时解锁cam_video_lock互斥锁,但是当发出条件信号时,在返回之前,它会重新锁定cam_video_lock.我对吗?

Pri*_*ley 20

建议所有线程在从pthread_cond_wait返回后检查条件,因为有几个原因条件可能不正确.其中一个原因是虚假的唤醒; 也就是说,即使没有线程表示该条件,线程也可能被唤醒.

来源:虚假的唤醒


Dav*_*rtz 15

虚假的唤醒是一个原因,但合法但无关的唤醒是另一个原因.

考虑:

  1. 你把一份工作放在队列上.

  2. 您发出条件变量的信号,唤醒线程A.

  3. 你把一份工作放在队列上.

  4. 你发出条件变量的信号,唤醒线程B.

  5. 线程A被安排,完成第一个工作.

  6. 线程A发现队列非空并执行第二个作业.

  7. 线程B被调度,已经被唤醒,但发现队列仍然是空的.