You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言(非C++)如何实现无需汇编代码的原子操作

C语言环境下无手写汇编的原子操作实现方案

你之前使用的<bits/atomic_word.h>和<ext/atomicity.h>是GNU C标准库的私有扩展头文件,仅支持C编译环境,切换为C语言编译后无法直接使用。以下是纯C环境下无需手写汇编的原子操作实现方案:

1. 标准C11原生原子操作(用户态跨平台首选)

C11标准正式引入了原子操作库,无需依赖C标准库或手写汇编,直接包含<stdatomic.h>头文件即可使用,完全兼容纯C编译环境。
对应你之前用到的C
原子操作能力,C11的等效实现示例:

#include <stdatomic.h>

// 对应之前的_Atomic_word use_count
atomic_int use_count = ATOMIC_VAR_INIT(0);

int main() {
    // 对应__gnu_cxx::__exchange_and_add_dispatch的功能:先返回原值再做加法
    int old_val = atomic_fetch_add(&use_count, 1, memory_order_relaxed);
    // 其他常用操作
    atomic_store(&use_count, 10, memory_order_release);
    int cur_val = atomic_load(&use_count, memory_order_acquire);
    return 0;
}
  • 说明:memory_order_*系列宏可以根据你的内存序需求调整,没有特殊同步需求用memory_order_relaxed性能最高。

2. Linux内核态原子操作

如果是Linux内核开发场景,内核提供了封装好的原子操作API,无需自行编写汇编,直接包含<linux/atomic.h>即可:

#include <linux/atomic.h>

// 内核专用原子变量类型
atomic_t use_count = ATOMIC_INIT(0);

// 等价exchange_and_add功能
int old_val = atomic_fetch_add(1, &use_count);
// 其他常用操作
atomic_set(&use_count, 10);
int cur_val = atomic_read(&use_count);
  • 内核的原子API已经针对不同架构做了底层适配,直接调用即可,无需关心底层汇编实现。

3. GCC内置原子扩展(兼容旧版C标准用户态场景)

如果你的编译环境不支持C11标准,可以用GCC内置的原子操作内置函数,无需额外引入头文件,编译器会自动生成对应架构的原子指令:

// 对应exchange_and_add功能:先返回原值再加1
int old_val = __sync_fetch_and_add(&use_count, 1);
// 更灵活的带内存序的版本(GCC 4.7+支持)
int old_val = __atomic_fetch_add(&use_count, 1, __ATOMIC_RELAXED);
  • 上述内置函数兼容x86、ARM等主流架构,不需要开发者手写汇编代码。

内容的提问来源于stack exchange,提问作者Saku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:15:05