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