原子操作
原子操作
以下是一组编译器宏,用于提供对整数和指针大小值的原子访问权限。
名称中带有“int”的宏将对指向 gint
和 guint
的指针进行操作。名称中带有“pointer”的宏将对指向任何指针大小值(包括 guintptr
)的指针进行操作。
不支持在具有 32 位指针的平台上进行 64 位操作,因为通常无法以原子方式执行这些操作。
整数和指针的 get、set 和 exchange 操作分别在 gint
和 gpointer
上进行操作。对于算术操作,‘add’ 操作对有符号整数值(gint
和 gssize
)进行操作(并返回有符号整数值),‘and’、'or' 和 'xor' 操作对无符号整数值(guint
和 gsize
)进行操作(并返回无符号整数值)。
所有操作都充当完整的编译器和(在适当的情况下)硬件内存屏障。通过此 API 无法使用获取和释放或生产者和消费者屏障语义。
务必要使用此 API 仅执行对特定整数或指针的所有访问,并且不要混合使用不同大小的操作或将其用于重叠的内存区域。永远不要直接读取或赋值到值,始终使用此 API。
对于简单的引用计数目的,您应该使用 gatomicrefcount
(参见 g_atomic_ref_count_init()
)而不是 g_atomic_int_inc()
和 g_atomic_int_dec_and_test()
。
如果 g_atomic_int_inc()
和 g_atomic_int_dec_and_test()
的使用超出简单的计数模式,则容易出现难以察觉的错误,偶尔会导致未定义的行为。同样值得注意的是,由于所有这些操作都需要对整台机器进行全局同步,因此它们可能非常慢。在执行多个原子操作的情况下,通常可以通过在关键区域周围获取互斥锁、正常执行操作然后释放锁来获得更快的速度。
原子整数操作
g_atomic_int_get()
g_atomic_int_set()
g_atomic_int_inc()
g_atomic_int_dec_and_test()
g_atomic_int_compare_and_exchange()
g_atomic_int_compare_and_exchange_full()
g_atomic_int_exchange()
g_atomic_int_add()
g_atomic_int_and()
g_atomic_int_or()
g_atomic_int_xor()
原子指针操作
g_atomic_pointer_get()
g_atomic_pointer_set()
g_atomic_pointer_compare_and_exchange()
g_atomic_pointer_compare_and_exchange_full()
g_atomic_pointer_exchange()
g_atomic_pointer_add()
g_atomic_pointer_and()
g_atomic_pointer_or()
g_atomic_pointer_xor()