当前位置: 首页 > news >正文

原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行

在计算机科学中,原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行,在操作过程中不会被其他线程或进程打断。这种特性确保了多线程环境下对共享资源的操作不会中间状态,从而避免竞态条件(Race Condition)。

核心特点

  1. 不可分割性:操作的所有步骤作为一个整体完成,不会被任何外部事件(如线程调度、中断)拆分。
  2. 无中间状态:其他线程只能看到操作执行前或执行后的状态,看不到执行过程中的临时状态。
  3. 硬件支持:通常由CPU的原子指令(如带锁前缀的汇编指令)提供底层支持,而非纯软件实现。

为什么需要原子操作?

在多线程场景中,看似简单的操作(如 count++)实际包含多个步骤(读取→修改→写入),若被其他线程打断,会导致数据不一致:

int count = 0;// 线程1执行
count++;  // 步骤1:读取count=0 → 步骤2:+1 → 步骤3:写入1// 线程2执行(若在线程1步骤1后、步骤3前被调度)
count++;  // 同样读取到0,最终结果可能为1(错误),而非预期的2

原子操作通过将这三步合并为一个不可分割的指令,确保上述情况不会发生。

原子操作的实现方式

  1. 硬件层面
    CPU提供原子指令(如x86的 LOCK 前缀指令),执行时会锁定总线或缓存,阻止其他CPU核心同时访问该内存地址。例如:

    • LOCK INC [count]:原子递增内存中的 count 值。
    • LOCK CMPXCHG:原子比较并交换(Compare-and-Swap,CAS)操作。
  2. 软件层面
    编程语言或库通过封装硬件原子指令,提供高层接口(如C11的 <stdatomic.h>、C++的 std::atomic、Linux的 atomic_t)。

常见原子操作类型

  1. 原子读写:对变量的读取或写入操作是原子的(如32位整数的读写在多数CPU上天然是原子的)。

  2. 原子修改

    • 自增(atomic_inc)、自减(atomic_dec
    • 加法(atomic_add)、减法(atomic_sub
    • 比较并交换(CAS:Compare-And-Swap):若当前值等于预期值,则更新为新值,返回操作是否成功。
  3. 原子位操作:对变量的特定位进行原子置位、清零或翻转。

代码示例(C语言,使用C11标准)

#include <stdatomic.h>
#include <pthread.h>
#include <stdio.h>// 定义原子变量(int类型)
atomic_int count = 0;// 线程函数:原子递增count
void *thread_func(void *arg) {for (int i = 0; i < 10000; i++) {// 原子自增操作(不可分割)atomic_fetch_add(&count, 1);}return NULL;
}int main() {pthread_t tid1, tid2;pthread_create(&tid1, NULL, thread_func, NULL);pthread_create(&tid2, NULL, thread_func, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);// 输出结果一定是20000(无竞态条件)printf("count = %d\n", atomic_load(&count));return 0;
}

说明
atomic_fetch_add 会将 count 原子递增1,替代了非原子的 count++,确保两个线程并发操作的正确性。

原子操作 vs 互斥锁

特性原子操作互斥锁(Mutex)
粒度单个变量的简单操作(如增减、赋值)任意代码块(临界区)
性能极高(仅需硬件指令,无上下文切换)较低(可能导致线程阻塞/唤醒)
适用场景简单数值操作(计数、标记位)复杂操作(如链表修改、多变量更新)
实现依赖硬件指令支持操作系统或库实现

注意事项

  1. 适用范围有限:原子操作仅适用于简单的变量操作,无法保护复杂的代码块(如多步逻辑、链表操作)。
  2. 类型限制:通常只支持整数、指针等基本类型,不直接支持结构体等复杂类型。
  3. 内存顺序:高级原子操作需考虑内存可见性(如C11的内存序:memory_order_seq_cstmemory_order_acquire等),确保多线程间的数据同步。

总结

原子操作是多线程编程中轻量级的同步机制,通过硬件保证的不可分割性,高效解决简单共享变量的并发访问问题。与互斥锁相比,它性能更高但适用场景更窄,常作为底层同步原语(如实现锁、信号量)或优化简单计数场景。

http://www.xdnf.cn/news/1424647.html

相关文章:

  • 贵州在假期及夏天结束后保持旅游活力的策略分析
  • AI如何重塑电力工程设计?揭秘良策金宝AI的六大“超能力”
  • SQLSERVER关键字:N
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 算法练习——189.轮转数组
  • 【逆序对 博弈】P10737 [SEERC 2020] Reverse Game|普及+
  • 【开题答辩全过程】以 基于JSP的养生网站设计与实现为例,包含答辩的问题和答案
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • Linux 进程间通信(IPC)
  • 大型语言模型微调 内容预告(69)
  • 【Docker】2025版Ubuntu 22.04 安装 Docker Docker Compose 指南
  • 电力工程师的AI时代已来,这6大功能彻底颠覆传统工作模式
  • 系统性学习数据结构-第二讲-顺序表与链表
  • 金融数据安全
  • 基于单片机汽车防盗系统/汽车安全防丢系统
  • 动态代理设计模式
  • 多模态大语言模型部署
  • Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点
  • 二、感知机
  • 高防IP防护效果评估全攻略:从指标解读到实战测试
  • langgraph / openmanus / suna 对比
  • 数据安全不用愁,群晖NAS让你存得放心、用得安心
  • 深度学习环境搭建运行(二) Ubuntu22.04安装基于CUDA11.8的ONNXRuntime-gpu1.18.1详细步骤(新手入门)
  • 联邦学习的文献复现与创新思路指导
  • Qt 项目文件(.pro)中添加 UI 文件相关命令
  • 深度学习】--卷积神经网络
  • k8s--etcd
  • h5实现内嵌微信小程序支付宝 --截图保存海报分享功能
  • authentication port-control auto 和 dot1x port-control auto
  • Linux ARP老化机制/探测机制/ip neigh使用