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
相关产品推荐
相关产品推荐

