为什么在等待条件variables时需要一个while循环?

说你有这个代码

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); 

我的问题是,为什么你需要一个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互斥量,但是当条件被发信号时,在返回之前,重新lockingcam_video_lock 。 我对吗?

Solutions Collecting From Web of "为什么在等待条件variables时需要一个while循环?"

建议所有线程在从pthread_cond_wait返回后检查条件,因为条件可能不是真的有几个原因。 其中一个原因是虚假的唤醒; 也就是说,即使没有线程发出信号,线程也可能会被唤醒。

来源: 虚假唤醒

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

考虑:

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

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

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

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

  5. 线程A被安排,做第一份工作。

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

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

出于性能原因,POSIX API允许操作系统唤醒您的线程,即使条件尚未满足(这就是所谓的虚假唤醒 )。