再次关于无锁...
假设我实现了一个基于整数的简单数组循环FIFO。 FIFO由2个线程(单个生产者,单个使用者)访问。读写索引始终在访问该项目后更新。在单个CPU上,这是安全的(假设索引的更新操作是原子的),因为只有一个线程具有对索引的写访问权。
在SMP机器上,这可能会引起问题,原因是两个CPU都可能由于其缓存和重新排序而看到索引的不同表示形式。
QT具有跨平台原子变量,该变量也实现了内存隔离,使用QAtomicInt可以使fifo实现SMP安全还是我忽略了什么?
最佳答案
只要您的其余实施都合理,这将是安全的。
如您所述,QAtomicInt实现了memory fences来防止指令重新排序,并且这还强制了处理器之间的缓存一致性(实际上x86和x86_64处理器的缓存都是一致的,尽管一致性协议会导致流水线停顿并降低性能如果您是紧密联系的依赖者)。
关于c++ - 使用QAtomicInt作为内存围栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14989048/