我一直在研究一个多线程C(Linux)应用程序 - 一个录像机,它有线程用于音频和视频捕获,编码,多路复用和写入。
我开始使用pthread操作临时将它放在一起,但是现在我正在尝试扩展它以支持更多的状态并重构代码块,这些代码块与锁定,设置标志和信号发送一样重复出现条件,等等。
到目前为止,我提出的是这样的事情:
我打算将公共元素存储在一个struct中,并且有一个结构数组,我可以循环来启动,检查和停止所有线程。
由于这变成了一个更通用的线程支持模型,我认为我正在重新发明轮子,所以我会问这里是否应该应用一些众所周知的模式。
答案 0 :(得分:4)
您的想法让我想起了许多在QP状态机框架中实现的主动对象计算模型。具体来说,QP / C和QP / C ++框架已经移植到POSIX(包括Linux,BSD等)。该端口已在应用说明“QP和Linux”中详细介绍,可在以下位置获取:http://www.state-machine.com/linux/AN_QP_and_Linux.pdf。
以下是Linux的QP端口的亮点:
每个状态机都在自己的p线程中执行。使用互斥锁和条件变量实现的事件队列上的p线程块。当事件队列收到事件时,线程解除阻塞,并且该事件由与该线程关联的状态机处理。 (这是众所周知的主动对象计算模型。)
事件队列归活动对象线程所有。
每个线程都有整个分层状态机,因此它可以具有“活动”或“非活动”状态。分层状态机(UML状态图)允许您指定更高级别状态的操作和转换,并且在嵌套状态下重用这种行为。这抵消了传统FSM的状态转换“爆炸”。