0

再说一次关于无锁的事情......

假设我实现了一个简单的基于数组的整数循环 FIFO。FIFO 由 2 个线程单生产者、单消费者访问。读取和写入索引始终在访问项目后更新。在单个 CPU 上,这将是安全的(假设索引的更新操作是原子的),因为只有一个线程具有对索引的写访问权限。在 SMP 机器上,这可能会导致问题,因为两个 CPU 可能会由于其缓存和重新排序而看到不同的索引表示。

QT 具有跨平台原子变量,它们也实现了内存栅栏,使用 QAtomicInt 会使 fifo 实现 SMP 安全还是我忽略了什么?

4

1 回答 1

1

这将是安全的,只要您的实施的其余部分是合理的。

正如您所提到的,QAtomicInt 实现了防止指令重新排序的内存栅栏,这也加强了处理器之间的缓存一致性(事实上,x86 和 x86_64 处理器的缓存无论如何都是一致的,尽管一致性协议可能会导致管道停顿并降低性能,如果你在一个紧密的循环中依赖它)。

于 2013-02-20T22:23:07.320 回答