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.我对吗?
Dav*_*rtz 15
虚假的唤醒是一个原因,但合法但无关的唤醒是另一个原因.
考虑:
你把一份工作放在队列上.
您发出条件变量的信号,唤醒线程A.
你把一份工作放在队列上.
你发出条件变量的信号,唤醒线程B.
线程A被安排,完成第一个工作.
线程A发现队列非空并执行第二个作业.
线程B被调度,已经被唤醒,但发现队列仍然是空的.