使用QAtomicInt作为内存栅栏

时间:2013-02-20 20:14:08

标签: c++ fifo smp memory-fences

再一次关于无锁......

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

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

1 个答案:

答案 0 :(得分:1)

如果您的其他实施方案合理,那将是安全的。

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