原子操作
原子操作
以下是一组编译器宏,用于提供对整数和指针大小值的原子访问权限。
名称中带有“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()