gpt4 book ai didi

c - 用于多线程应用程序的数据结构(和 C 中的跨平台实现)

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:40 25 4
gpt4 key购买 nike

我正在为以下场景寻找数据结构:

  1. 线程池应该对数据 block 的文件类型进行分类
  2. 每个线程都从这个(阻塞的)数据结构中读取
  3. 另一个线程(不是线程池的一部分)从存储设备中读取 block 并将它们提供给数据结构。
  4. 如果没有更多数据可用,读取线程会通知(或中断)数据结构,以便池中被阻塞的线程可以退出并关闭。

您认为阻塞式 FIFO 队列在这里是否合适/足够?另一个要求是数据结构作为开源可用,并且可以针对不同的操作系统(至少是 Windows/Linux)进行编译。

APR Util library乍一看很有希望,但 Visual Studio 的项目文件是为这个编译器套件的史前版本准备的。

最佳答案

生产者-消费者 FOFO 阻塞队列似乎是合理的。所有多线程操作系统都有合适的信号量/互斥锁/condvars/任何东西来制作 P-C 队列,您可以在一个特定于操作系统的接口(interface)单元中定义。

我将使用的“数据结构”是一个 *SomeStruct 队列,它可以包含一个数据 block 和处理该 block 所需的任何其他元数据。

当做这类事情时,我通常会创建一个大的“池队列”(另一个 P-C 队列),它在应用程序启动时被 malloced/calloced *SomeStruct 填充。然后,线程只会将 *SomeStructs 从池中循环,进入读取线程,进入线程池 FIFO,进入处理线程,最后返回池队列。这种流量控制数据,防止内存失控并消除连续的 malloc/free。

编辑:

是的,FOFO 是一个 FOOBAR。

我的设计使用两个 FIFO、线程安全、阻塞队列:

a) 池队列,在启动时填充固定数量的 malloced/calloced *SomeStructs。

b) 等待处理线程的处理队列。

读取线程从池队列中取出 *SomeStructs,加载它们,将它们排队到处理队列,处理线程在处理队列中获取它们,处理它们,然后,当所有完成后,将它们重新排队到池队列。

这意味着 SomeStructs 的数量限制为启动时创建的数量,因此您无需在应用程序运行时再执行任何 malloc/calloc 或 free。此外,如果读取线程试图“领先于”处理线程,则池队列将为空并且读取线程将阻塞它,直到处理线程将一些“使用过的”*SomeStructs 返回到池中以供重新使用——读取线程将再次运行。

另一个优点是您不需要复杂的、有界的队列。由于 *SomeStruct 实例的总数限制为启动时创建的数量,队列只需要足够大以容纳该数量——它们永远不必再容纳。因此,一个简单的固定大小的 *SomeStruct[CtotalInstances] 数组就可以作为队列的基础,并且您不需要对数组是否已满进行任何索引检查,也不需要使用额外的信号量来计算 '空白':)

哦 - 关闭 - 我可能不会费心关闭线程。如果他们无事可做,他们可以坐在那里,什么都不做,直到应用程序关闭。如果您真的需要关闭处理线程,请在队列上发送一条“毒药丸”消息(空指针是一个好药丸 - 它不需要释放),告诉接收线程将药丸推回队列然后清理并退出 - 在短时间内,所有处理线程都会得到药丸并自杀。

关于c - 用于多线程应用程序的数据结构(和 C 中的跨平台实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249248/

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