一尘不染

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

linux

说你有这个代码

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_waitcam- > status不等于
WAIT_DISPAY ,但是在那种情况下,您可以通过 if 条件检查它,而不是使用 while
*

我在这里想念什么吗?我对 pthread_cond_wait的 理解是,如果未发出 cam_video_cond
信号,它将仅等待无限。此外,它在被调用时会解锁 cam_video_lock 互斥锁,但是当发出条件信号时,它将在返回之前重新锁定
cam_video_lock 。我对吗?


阅读 856

收藏
2020-06-03

共1个答案

一尘不染

建议所有线程从 pthread_cond_wait
返回后检查条件,因为有多种原因可能导致条件不成立。这些原因之一是虚假唤醒。也就是说,即使没有线程发出信号通知该情况,线程也可能被唤醒。

2020-06-03