当前位置: 首页 > 面试题库 >

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

宗政金鹏
2023-03-14
问题内容

说你有这个代码

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 。我对吗?


问题答案:

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



 类似资料:
  • 问题内容: 我刚刚遇到了这段代码 并且认为, 必须 有一个比用无限循环更好的方法。 所以我尝试了: 显然有一个错误。 有什么方法可以避免在那种情况下使用? 编辑: 理想情况下,您要避免重复说两次…恕我直言,重复甚至比a还要糟糕,尤其是在语句很复杂的情况下。 问题答案: 如果您不对数据做任何奇特的事情,例如以后再阅读更多行,总会有:

  • 问题内容: 每个循环的通常形式是: 但是,如果我想在循环之后一直保留bar,则 不能 为每个循环使用: for循环获取上述语法错误。 为什么是这样? 我对变通办法不感兴趣,但只是对这种限制背后的考虑感到好奇。 相反,使用普通的for循环,变量可以在外部声明或根本不声明。 问题答案: 这是一个很好的问题,我很乐意看到一些深入的答案。但是,官方文档说: 这些缺点为设计师所知,他们明智地决定采用一种干净

  • Python有一个名为<code>Condition或<code>notify_all()。然而,在调用<code>wait()acquire()wait()方法然后释放锁并等待通知,然后它将继续重新获取锁,您可以运行一些需要线程安全的代码。我的问题是,当调用<code>wait()方法时,<code>条件</code>对象为什么不在内部自动获取锁: 必须调用其他方法并按住关联的锁。 方法释放锁,

  • 当我像这样做一个常规的while循环时 它打印 但第二个while循环在满足条件后再次运行。 所以结果是 “佛罗多是一个很好的霍比特人的名字”难道它不应该停止印刷吗 我设置了x的条件 编辑:哦,我现在明白了,哈哈,我想增量是在代码的末尾,开始是0

  • 如果我有这个功能 然后投入140000000,那么这将需要一秒钟来完成。如果我需要返回的值来继续一个函数的其余部分,我想我需要等待响应,这样我就可以使用响应了 但事实上,我认为它与其说是一个值,我需要传递到下一个函数中,让它工作,所以它基本上没有等待响应,因为它基本上发送一个函数作为参数,如 所以,也许我在这里花了很多时间,但基本上,我如何实现同步编程,什么不适合速度,什么是正确使用异步和prom

  • 我的问题是关于,它是从方法抛出的。在使用时,我注意到一些我不理解的奇怪行为;我的意思是: 使用此代码,编译器不会给我任何错误或消息,即应该捕获来自的。但是当我试图改变循环条件并用下面这样的变量替换“true”时: 编译器不断抱怨必须处理。有人能给我解释一下为什么会发生这种情况,为什么如果条件设置为true,编译器会忽略InterruptedException?