Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在等待条件变量时需要while循环_C_Linux_Pthreads_Signals - Fatal编程技术网

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

C 为什么在等待条件变量时需要while循环,c,linux,pthreads,signals,C,Linux,Pthreads,Signals,假设你有这个密码 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->vi

假设你有这个密码

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);
pthread\u mutex\u lock(&cam->video\u lock);
while(cam->status==等待显示)//video\u cond,&cam->video\u lock);
pthread_mutex_unlock(&cam->video_lock);
我的问题是,为什么在这里需要一个while循环。难道不pthread_cond_wait只是等待,直到信号线程发出信号cam_video_cond?好的,我知道当调用pthread\u cond\u WAIT时,cam->status可能不等于WAIT\u DISPAY,但是在这种情况下,您可以通过if条件检查它,而不是在期间使用


我是不是遗漏了什么?我对pthread_cond_wait的理解是,如果没有发出信号,它只会等待无限。此外,当调用时,它会解锁cam\u video\u lock互斥锁,但当条件发出信号时,在返回之前,它会重新锁定cam\u video\u lock。我说得对吗?

出于性能原因,POSIX API允许操作系统唤醒线程,即使条件尚未满足(这称为a)

建议所有线程在返回后检查状况 frompthread\u cond\u wait,原因有多种 可能不是真的。其中一个原因是虚假的觉醒;就是, 线程可能会被唤醒,即使没有线程向 条件


来源:

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

考虑:

  • 您将作业放入队列中

  • 您向条件变量发送信号,唤醒线程A

  • 您将作业放入队列中

  • 您向条件变量发送信号,唤醒线程B

  • 线程A被调度,执行第一个作业

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

  • 线程B已被唤醒,但发现队列仍然为空

  • 同样的问题,