GCC内置的原子操作函数

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 文档中提供的具体细节和注意事项,以确保正确的并发控制和内存模型选择。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容