2012-02-28 24 views
5

我一直在研究多线程C(Linux)应用程序一段时间 - 录像机有音频和视频捕获,编码,复用和写入线程。多线程C应用程序框架或模式

我开始使用pthread操作将它一起扔到一起,但现在我试图扩展它以支持更多的状态并重构代码块,这些块会弹出为重复的锁定,设置标志和信号一个条件,等等。

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

  • 每个线程都应该有一个互斥锁,并满足两个条件 - 一个唤醒线程和其他信号线程完成执行一些其他线程可能正在等待的工作。
  • 数据队列由某个线程“拥有”,并使用该线程的锁保护。
  • 每个线程都需要“有效”和“无效”状态的概念,以及在完成时在这些和信号之间移动的能力。

我打算将常见元素存储在一个结构中,并有一个这些结构的数组,我可以循环来启动,检查并停止所有线程。因为这变成了一个更通用的线程支持模型,我认为我很可能重新发明了轮子,所以我会问这里是否有一些我应该应用的已知模式。

+1

看一看[油嘴(http://developer.gnome.org/glib/stable/ glib-core.html) – 2012-02-28 09:46:46

+0

@AlexandreC我对Glib不太了解,但看起来它只是抽象线程并增加了重量,我正在寻找线程交互模型 – blueshift 2012-02-29 07:02:34

回答

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线程块使用互斥量和条件变量实现。当事件队列接收到事件时,线程解除阻塞,事件由与此线程关联的状态机处理。 (这是众所周知的主动对象计算模型。)

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

  • 每个线程都有整体层次状态机,所以它也有状态“激活”或“禁用”。分层状态机(UML状态图)允许你指定在较高的水平状态,操作和转换重用这在嵌套状态的行为。这抵消了国家转变“爆炸”,你必须与传统的有限状态机。

+0

这看起来非常有趣和相关,谢谢! – blueshift 2012-02-29 07:00:51