glib的g_atomic_int_get的目的是什么?
问题描述:
glib a提供了g_atomic_int_get
函数来自动读取一个标准的C int
类型。不是将32位整数从存储器读取到寄存器中,这些寄存器尚未保证是处理器的原子操作(例如mov <reg32>, <mem>
)?glib的g_atomic_int_get的目的是什么?
如果是,那么glib的g_atomic_int_get
函数的目的是什么?
答
某些处理器允许读取未对齐的数据,但这可能需要超过一个周期。即它不再是原子的。在别人身上,根本不可能是一个原子操作。
答
x86 mov
指令并不总是原子的,它是:它是non-atomic if the addresses involved are not naturally aligned。
即使它总是原子的,它不是memory barrier,这意味着编译器可以自由地重新排列指令并参考附近的其他指令;并且处理器可以在运行时参考指令流中的其他指令自由地重新排序指令。除非您正在编写仅针对单个平台的代码(并确保代码永远不需要移植到另一个平台),否则如果需要原子保证,则必须始终使用显式原子指令。
'是不是......已经保证是处理器的原子操作?'好吧,_what_处理器?我确定有一些地方,有些地方不是。 – Siguza
int也可能不是32位,既不是寄存器。 – user3528438