gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:33:15 25 4
gpt4 key购买 nike

一段时间以来,我一直在开发多线程 C (Linux) 应用程序 - 一种录像机,它具有用于音频和视频捕获、编码、多路复用和写入的线程。

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

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

  • 每个线程都应该有一个互斥锁和两个条件 - 一个用于唤醒线程,另一个用于指示该线程已完成另一个线程可能正在等待的工作。
  • 数据队列由特定线程“拥有”并使用该线程的锁进行保护。
  • 每个线程都需要“事件”和“非事件”状态的概念以及在这些状态之间移动并在完成时发出信号的能力。

我计划将公共(public)元素存储在一个结构中,并拥有一个我可以循环启动、检查和停止所有线程的结构数组。

随着这变成一个更通用的线程支持模型,我认为我可能正在重新发明轮子,所以我会在这里询问是否有一些我应该应用的众所周知的模式。

最佳答案

您的想法让我想起了很多在 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 的状态转换“爆炸”。

关于c - 多线程 C 应用程序框架或模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9478753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com