以下是正确的吗?
- 如果必须以多种方式(io 操作或注释)处理每个条目,则破坏者模式具有更好的并行性能和可扩展性,因为可以使用多个消费者并行化而不会发生争用。
- 相反,如果每个条目只能以单一方式处理,工作窃取(即在本地存储条目并从其他线程窃取条目)具有更好的并行性能和可伸缩性,因为在中断模式中将条目不相交地分布到多个线程会导致争用。
(当涉及多个生产者(即CAS 操作)时,破坏者模式是否仍然比其他无锁多生产者多消费者队列(例如来自 boost )快得多?)
我的详细情况:
处理一个条目可以产生几个新条目,最终也必须处理这些条目。性能具有最高优先级,按 FIFO 顺序处理的条目具有第二优先级。
在当前的实现中,每个线程都使用本地 FIFO,并在其中添加新条目。空闲线程从其他线程的本地 FIFO 窃取工作。线程处理之间的依赖关系使用无锁、机械同理哈希表(写入时的 CAS,具有桶粒度)来解决。这导致争用非常低,但 FIFO 顺序有时会被破坏。
使用破坏者模式将保证 FIFO 顺序。但是,将条目分配到线程上会不会导致比具有工作窃取的本地 FIFO 更高的争用(例如,读取光标上的 CAS)(每个线程的吞吐量大致相同)?
我找到的参考资料
关于破坏者的标准技术文件(第 5 + 6 章)中的性能测试不包括不相交的工作分布。
https://groups.google.com/forum/?fromgroups=#!topic/lmax-disruptor/tt3wQthBYd0是我找到的关于破坏者 + 工作窃取的唯一参考。它指出如果有任何共享状态,每个线程的队列会显着变慢,但没有详细说明或解释原因。我怀疑这句话是否适用于我的情况:
- 使用无锁哈希表解析共享状态;
- 必须在消费者之间不连贯地分发条目;
- 除了工作窃取之外,每个线程只在其本地队列中读写。