使用QAtomicInt作为内存围栏

Using QAtomicInt as memory fence

本文关键字:内存 QAtomicInt 使用      更新时间:2023-10-16

关于免锁的内容。。。

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

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

如果实现的其余部分是健全的,那么它将是安全的。

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