C++ RPi2、OpenMAX、死锁 环境 树莓皮2 B+ DebianLinux OpenMAX IL 用例 OpenMAX摄像头视频捕获 相机端口已禁用 已设置渲染器/摄影机通道 所有组件状态都设置为空闲 端口已启用 问题描述

C++ RPi2、OpenMAX、死锁 环境 树莓皮2 B+ DebianLinux OpenMAX IL 用例 OpenMAX摄像头视频捕获 相机端口已禁用 已设置渲染器/摄影机通道 所有组件状态都设置为空闲 端口已启用 问题描述,c++,linux,multithreading,raspberry-pi,openmax,C++,Linux,Multithreading,Raspberry Pi,Openmax,启用摄像头输入端口的第一个端口(端口#73),使用“OMX_CommandPortEnable”命令启用该端口,与使用“OMX_CommandPortDisable”命令一样,预计摄像头组件将触发“OMX_CALLBACKTYPE::EventHandler”事件处理程序,该事件处理程序具有“eEvent==OMX_EventCmdComplete”和“nda1==OMX_CommandPortEnable”,但是,这永远不会发生,应用程序会无限期地等待端口启用 问题分析 我将std::cond

启用摄像头输入端口的第一个端口(端口#73),使用“OMX_CommandPortEnable”命令启用该端口,与使用“OMX_CommandPortDisable”命令一样,预计摄像头组件将触发“OMX_CALLBACKTYPE::EventHandler”事件处理程序,该事件处理程序具有“eEvent==OMX_EventCmdComplete”和“nda1==OMX_CommandPortEnable”,但是,这永远不会发生,应用程序会无限期地等待端口启用

问题分析 我将std::condition_变量与std::mutex结合使用,以等待状态更改完成,因此,OMX_CALLBACKTYPE::EventHandler使用这种方法更新条件变量并调用“notify_one()”,同时调用方线程锁定std::mutex并等待设置条件变量“OMX_CALLBACKTYPE::EventHandler”永远不会被调用(带有任何参数),并且程序将永远锁定。
注意:当等待条件变量验证互斥体不为所有时,可通过验证(0==std::mutex::_owner)完成此操作。
但是当通过反复调用usleep和OMX_GetParameter(OMX_IndexParamPortDefinition)轮询端口状态时,所有这些都可以正常工作

手头的问题
为什么“OMX_CALLBACKTYPE::EventHandler”在轮询其值时触发,而在使用条件_变量时不触发?在windows中有APC和可警报线程的概念,linux中是否有任何等效的概念?可以解释上述情况的一个概念?

我的经验是,在端口填充缓冲区之前,启用端口不会发出事件回调。Th在is,顺序是:

  • 将端口设置为已启用(
    OMX\u SendCommand()
    with
    OMX\u CommandPortEnable
  • 填充端口缓冲区(
    OMX\u AllocateBuffer()
    OMX\u UseBuffer()
  • 接收
    OMX\u CommandPortEnable
    事件回调
如果在分配缓冲区之前等待事件回调,则会出现死锁

当您通过测试
OMX\u参数\u PORTDEFINITIONTYPE.bEnabled
进行轮询时,将立即返回
OMX\u TRUE
,因为该成员是同步设置的:

端口应立即在其端口定义中设置为启用 当端口接收到OMX\u CommandPortEnable时的结构

以下是我认为当事情“起作用”时发生的事情:

  • 将端口设置为已启用
  • 轮询直到
    bEnabled
    OMX\u TRUE
    (立即发生)
  • 填充端口缓冲区
  • 接收
    OMX\u CommandPortEnable
    事件回调
您可能会错误地认为它是按以下顺序发生的:

  • 将端口设置为已启用
  • 轮询直到
    bEnabled
    OMX\u TRUE
    (立即发生)
  • 接收
    OMX\u CommandPortEnable
    事件回调
  • 填充端口缓冲区
这使得使用条件变量似乎在某种程度上改变了OpenMAX行为。实际上,
bEnabled
OMX\u CommandPortEnable
回调并没有真正报告相同的情况。我不认为在启用端口和分配其缓冲区之间有必要(或需要)任何同步