glib a提供g_atomic_int_get
函数以原子方式读取标准C int
类型。是不是将32位整数从存储器读入寄存器并不能保证处理器的原子操作(例如mov <reg32>, <mem>
)?
如果是,那么glib g_atomic_int_get
函数的目的是什么?
答案 0 :(得分:5)
某些处理器允许读取未对齐的数据,但这可能需要多个周期。即它不再是原子的。在其他情况下,它可能根本不是原子操作。
答案 1 :(得分:0)
x86 mov
指令也不总是原子的:它是non-atomic if the addresses involved are not naturally aligned。
即使它总是原子的,也不是memory barrier,这意味着编译器可以参考附近的其他指令自由地重新排序指令;并且处理器可以在运行时参考指令流中的其他指令自由地重新排序指令。
除非您编写的代码仅针对单个平台(并且确保代码永远不需要移植到另一个平台),否则如果您需要原子保证,则必须始终使用显式原子指令。