在多线程管道中维护订单

Kaz*_*gon 4 multithreading

我正在考虑处理管道的多线程架构.我的主处理模块有一个输入队列,从中接收数据包.然后,它对这些数据包执行转换(解密等)并将它们放入输出队列.

线程来自于许多输入包可以使它们的内容彼此独立地转换.

但是,妙语是输出队列必须与输入队列具有相同的顺序(即,第一个拉出输入队列必须首先被推入输出队列,无论其转换是否先完成.)

当然,输出队列会有某种同步,所以我的问题是:确保维持这种排序的最佳方法是什么?

Ant*_*ams 11

让一个线程读取输入队列,在输出队列上发布占位符,然后将项目交给工作线程进行处理.数据准备就绪后,工作线程会更新占位符.当需要输出队列中的值的线程读取占位符时,它可以阻塞,直到相关数据准备就绪.

因为只有一个线程读取输入队列,并且此线程立即将占位符放在输出队列上,所以输出队列中的顺序与输入中的顺序相同.工作线程可以很多,并且可以按任何顺序进行转换.

在支持期货的平台上,它们是占位符的理想选择.在其他系统上,您可以使用事件,监视器或条件变量.


ULy*_*ses 5

具有以下假设

  • 应该有1个输入队列,1个输出队列和1个工作队列
  • 应该只有一个输入队列监听器
  • 输出消息应包含等待句柄和指向工作/输出数据的指针
  • 可能有任意数量的工作线程

我会考虑以下流程:

输入队列侦听器执行以下步骤:

  1. 提取输入消息;
  2. 创建输出消息:
    1. 初始化worker数据结构
    2. 重置等待句柄
  3. 将指向输出消息的指针放入工作队列中
  4. 将指向输出消息的指针放入输出队列中

工作线程执行以下操作:

  1. 等待工作队列以从中提取指向输出消息的指针
  2. 根据给定的数据处理消息并在完成后设置事件

消费者执行以下操作:

  1. 等待 n 个输出队列以从中提取指向输出消息的指针
  2. 等待句柄直到输出数据准备好
  3. 对数据做一些事情

  • 实际上,我确实喜欢这样:因为只有一个输入队列侦听器,并且它是唯一负责将消息放置到输出队列上的参与者,所以它可以确保序列本身。此外,由于输入队列侦听器知道输出队列何时变为非空,因此它也可以安排下一个处理阶段。很多细节都由此而生。 (2认同)