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

c++ 嵌入汇编的方式实现int型自增

x86/x86_64 实现

x86 平台上,使用 LOCK XADD 指令来实现原子自增:

#include <iostream>

inline int atomic_increment_x86(int* value) {
    int result;
    __asm__ __volatile__(
        "lock xaddl %1, %0"
        : "+m"(*value), "=r"(result)
        : "1"(1)
        : "memory"
    );
    return result + 1;
}

说明

  • lock xaddl 指令用于原子地将寄存器的值加到内存变量上,并返回原值。
  • +m(*value): +m 表示被修改的内存操作数。
  • "1"(1): 约束 1 号操作数使用寄存器,并初始化为 1
  • memory 作为 clobber 说明该指令会修改内存。

ARM(ARMv7)实现

在 ARM(32 位)上,使用 ldrexstrex 指令实现原子操作:

#include <iostream>

inline int atomic_increment_arm(int* value) {
    int result, tmp;
    __asm__ __volatile__(
        "1: ldrex %0, [%2]\n"
        "   add %0, %0, #1\n"
        "   strex %1, %0, [%2]\n"
        "   teq %1, #0\n"
        "   bne 1b\n"
        : "=&r"(result), "=&r"(tmp)
        : "r"(value)
        : "memory", "cc"
    );
    return result;
}

说明

  • ldrex 加载值到 result,并设置独占标志。
  • add 执行加 1 操作。
  • strex 试图存回新值到 value,并检查是否成功(如果 strex 失败,则循环重试)。
  • teq %1, #0 检测 strex 失败标志,不为 0 时回到 1: 处重试。

ARM64(AArch64)实现

在 ARM64(64 位)上,可以使用 ldxrstxr 进行原子操作:

#include <iostream>

inline int atomic_increment_arm64(int* value) {
    int result, tmp;
    __asm__ __volatile__(
        "1: ldxr %w0, [%2]\n"
        "   add %w0, %w0, #1\n"
        "   stxr %w1, %w0, [%2]\n"
        "   cbnz %w1, 1b\n"
        : "=&r"(result), "=&r"(tmp)
        : "r"(value)
        : "memory"
    );
    return result;
}

说明

  • ldxr(load exclusive register)加载 value,并建立独占访问。
  • stxr(store exclusive register)存储 value,如果失败,则重新加载并重试。
  • cbnz 指令检查 stxr 失败标志,不为 0 时回到 1: 处重试。

c++封装

#include <iostream>

inline int atomic_increment(int* value) {
#if defined(__x86_64__) || defined(__i386__)
    return atomic_increment_x86(value);
#elif defined(__aarch64__)
    return atomic_increment_arm64(value);
#elif defined(__arm__)
    return atomic_increment_arm(value);
#else
    #error "Unsupported architecture"
#endif
}

int main() {
    int counter = 0;
    std::cout << "Before: " << counter << std::endl;
    std::cout << "After: " << atomic_increment(&counter) << std::endl;
    return 0;
}

相关文章:

  • Javascript ajax
  • Compose笔记(八)--权限
  • 《Operating System Concepts》阅读笔记:p208-p227
  • 更新vscode ,将c++11更新到c++20
  • springboot旅游管理系统设计与实现(代码+数据库+LW)
  • openharmory-鸿蒙生态设备之间文件互传发现、接入认证和文件传输
  • 通义千问本地配置并实现微调
  • 手写Tomcat:实现基本功能
  • FastAPI Cookie 和 Header 参数完全指南:从基础到高级实战 [特殊字符]
  • MyBatis-Plus 注解大全
  • Java字符串拼接的底层原理与性能优化
  • C++类和对象入门(三)
  • uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!
  • ESP8266TCP客户端(单连接TCP Client)
  • java项目springboot 项目启动不了解决方案
  • 线性表相关代码(顺序表+单链表)
  • Python深度学习算法介绍
  • 基于SpringBoot的历史馆藏系统设计与实现(源码+SQL脚本+LW+部署讲解等)
  • JDK 的 SPI 和 Dubbo 的 SPI
  • vector模板类的模拟实现
  • 企业网站建设哪里做网站好/前端性能优化有哪些方法
  • qq建设网站首页/焦作seo公司
  • wp网站搬家教程/十大新媒体平台有哪些
  • 机加工外协网站/重要新闻
  • 六合哪家做网站建设/google图片搜索引擎入口
  • 怎样开网店流程视频/深圳百度搜索排名优化