![]() |
1
4
假设如下
我将考虑以下流程: 输入队列侦听器执行以下步骤:
工作线程执行以下操作:
消费者执行以下操作:
|
![]() |
2
11
让一个线程读取输入队列,在输出队列上发布一个占位符,然后将该项移交给工作线程进行处理。当数据准备就绪时,工作线程将更新占位符。当需要输出队列中的值的线程读取占位符时,它可以阻塞,直到关联的数据就绪。 因为只有一个线程读取输入队列,而这个线程立即将占位符放在输出队列中,所以输出队列中的顺序与输入中的顺序相同。工作线程可以是多个的,并且可以以任何顺序进行转换。 在支持未来的平台上,它们是理想的占位符。在其他系统上,您可以使用事件、监视器或条件变量。 |
![]() |
3
1
这将是特定于实现的。一个通用的解决方案是对输入项进行编号并保留编号,以便以后对输出项进行排序。这可以在输出队列被填充后完成,也可以作为填充队列的一部分完成。换句话说,您可以将它们插入到适当的位置,并且只允许在下一个可用项是连续的时读取队列。 编辑 我将勾画出一个基本的方案,通过使用适当的原语来保持它的简单:
简单,但有效。 |
![]() |
4
0
如果使用窗口方法(已知元素数),请为输出队列使用数组。例如,如果它是媒体流,而您丢弃的包处理速度不够快。 否则,使用 priority queue (特殊类型的堆,通常基于固定大小的数组实现)用于输出项。 您需要添加一个序列号或任何可以对每个数据包中的项目进行排序的数据。优先级队列是一个树形结构,确保插入/弹出时项目的顺序。 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 2 年前 |