多线程C应用程序框架或模式

blu*_*ift 5 c linux embedded design-patterns pthreads

我一直在研究一个多线程C(Linux)应用程序 - 一个录像机,它有线程用于音频和视频捕获,编码,多路复用和写入.

我开始使用pthread操作临时将它放在一起,但是现在我正在尝试扩展它以支持更多状态并重构代码块,这些代码块与锁定,设置标志和发出条件信号重复出现,以及等等.

到目前为止,我想出的是这样的:

  • 每个线程都应该有一个互斥锁和两个条件 - 一个用于唤醒线程,另一个用于表示线程已经完成了另一个线程可能正在等待的一些工作.
  • 数据队列由某个线程"拥有"并使用该线程的锁保护.
  • 每个线程都需要"活动"和"非活动"状态的概念,以及在完成之后在信号和信号之间移动的能力.

我打算将公共元素存储在一个结构中,并有一个结构数组,我可以循环来启动,检查和停止所有线程.

由于这变成了一个更通用的线程支持模型,我以为我可能会重新发明轮子,所以我会问这里是否应该应用一些众所周知的模式.

Mir*_*mek 4

你的想法让我想起了很多在 QP 状态机框架中实现的主动对象计算模型。具体来说,QP/C和QP/C++框架已移植到POSIX(包括Linux、BSD等)。该端口已在应用说明“QP 和 Linux”中详细描述,网址为:http://www.state-machine.com/linux/AN_QP_and_Linux.pdf

以下是 QP 移植到 Linux 的亮点:

  • 每个状态机都在自己的 p 线程中执行。p 线程阻塞在使用互斥体和条件变量实现的事件队列上。当事件队列接收到事件时,线程解除阻塞,并且该事件由与该线程关联的状态机处理。(这是众所周知的主动对象计算模型。)

  • 事件队列由活动对象线程拥有。

  • 每个线程都有完整的分层状态机,因此它可以具有“活动”或“非活动”状态。分层状态机(UML 状态图)允许您指定更高级别状态的操作和转换,并在嵌套状态中重用此行为。抵消了传统 FSM 中的状态转换“爆炸”。