GCC 提供了一些内置的原子操作函数,用于在多线程或并发编程中执行原子操作。这些函数通常用于确保在多线程环境中对共享资源进行安全访问。下面是一些常用的 GCC 内置原子操作函数:
1.__atomic_fetch_add(type *ptr, type val, int memmodel):
原子地将 val 添加到 *ptr 指向的变量中,并返回添加前的值。
type 是变量的类型,可以是 int, long, long long 等。
memmodel 是内存模型,通常用 __ATOMIC_SEQ_CST 表示顺序一致性内存模型。
示例:
__atomic_fetch_add(&my_var, 1, __ATOMIC_SEQ_CST);
2.__atomic_fetch_sub(type *ptr, type val, int memmodel):
原子地从 *ptr 指向的变量中减去 val,并返回减去前的值。
参数与 __atomic_fetch_add 类似。
3.__atomic_fetch_and(type *ptr, type val, int memmodel):
原子地对 *ptr 指向的变量执行按位与操作。
参数与 __atomic_fetch_add 类似。
4.__atomic_fetch_or(type *ptr, type val, int memmodel):
原子地对 *ptr 指向的变量执行按位或操作。
参数与 __atomic_fetch_add 类似。
5.__atomic_fetch_xor(type *ptr, type val, int memmodel):
原子地对 *ptr 指向的变量执行按位异或操作。
参数与 __atomic_fetch_add 类似。
6.__atomic_compare_exchange(type *ptr, type *expected, type desired, bool weak, int success_memmodel, int failure_memmodel):
原子地比较 *ptr 指向的变量与 *expected 的值,如果相等则将 *ptr 更新为 desired,并将 *expected 更新为 *ptr 原先的值。
weak 参数表示是否使用弱 CAS (compare-and-swap)。
success_memmodel 和 failure_memmodel 分别指定成功和失败时的内存模型。
示例:
int expected = 1;
int desired = 2;
__atomic_compare_exchange(&my_var, &expected, desired, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
这些函数使用了特殊的内置类型和内存模型,确保在并发环境中执行这些操作时不会产生竞态条件。在使用这些函数时,应当详细了解 GCC 文档中提供的具体细节和注意事项,以确保正确的并发控制和内存模型选择。