原子操作

原子操作

以下是一组编译器宏,用于提供对整数和指针大小值的原子访问权限。

名称中带有“int”的宏将对指向 gintguint 的指针进行操作。名称中带有“pointer”的宏将对指向任何指针大小值(包括 guintptr)的指针进行操作。

不支持在具有 32 位指针的平台上进行 64 位操作,因为通常无法以原子方式执行这些操作。

整数和指针的 get、set 和 exchange 操作分别在 gintgpointer 上进行操作。对于算术操作,‘add’ 操作对有符号整数值(gintgssize)进行操作(并返回有符号整数值),‘and’、'or' 和 'xor' 操作对无符号整数值(guintgsize)进行操作(并返回无符号整数值)。

所有操作都充当完整的编译器和(在适当的情况下)硬件内存屏障。通过此 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() 的使用超出简单的计数模式,则容易出现难以察觉的错误,偶尔会导致未定义的行为。同样值得注意的是,由于所有这些操作都需要对整台机器进行全局同步,因此它们可能非常慢。在执行多个原子操作的情况下,通常可以通过在关键区域周围获取互斥锁、正常执行操作然后释放锁来获得更快的速度。

原子整数操作

原子指针操作

已弃用的 API