• VC/C++ Intel x86 内联汇编实现 “Interlocked” 原子变量各种操作


    函数名:原子添加 / InterlockedAdd

    返回值:返回原子添加以后的值。

    1. int __InterlockedAdd(volatile int* localtion1, int value) noexcept {
    2. _asm {
    3. mov eax, dword ptr[value]
    4. mov ecx, dword ptr[localtion1]
    5. lock xadd dword ptr[ecx], eax
    6. add eax, dword ptr[value]
    7. }
    8. }

    函数名:原子减少 / InterlockedSub

    返回值:返回原子减少以后的值。

    1. int __InterlockedSub(volatile int* localtion1, int value) noexcept {
    2. _asm {
    3. mov eax, dword ptr[value]
    4. neg eax
    5. mov ecx, dword ptr[localtion1]
    6. lock xadd dword ptr[ecx], eax
    7. sub eax, dword ptr[value]
    8. }
    9. }

    函数名:原子递增 / InterlockedIncrement

    返回值:返回原子递增以后的值

    1. inline
    2. int __InterlockedIncrement(volatile int* localtion1) noexcept {
    3. return __InterlockedAdd(localtion1, 1);
    4. }

    函数名:原子递减 / InterlockedDecrement

    返回值:返回原子递减以后的值。

    1. inline
    2. int __InterlockedDecrement(volatile int* localtion1) noexcept {
    3. return __InterlockedSub(localtion1, 1);
    4. }

    函数名:原子改变 / InterlockedExchange

    返回值:返回原子改变之前的值。

    1. int __InterlockedExchange(volatile int* localtion1, int value) noexcept {
    2. _asm {
    3. mov ecx, dword ptr[localtion1]
    4. mov edx, dword ptr[value]
    5. lrw:
    6. lock cmpxchg dword ptr[ecx], edx
    7. jne lrw
    8. }
    9. }

    函数名:原子比较改变 / InterlockedExchange

    返回值:返回原子比较改变之前的值,若未改变则返回原子原值。

    1. int __InterlockedCompareExchange(volatile int* localtion1, int value, int comparand) noexcept {
    2. _asm {
    3. mov ecx, dword ptr[localtion1] // localtion1
    4. mov edx, dword ptr[value] // value
    5. mov eax, dword ptr[comparand] // comparand
    6. lock cmpxchg dword ptr[ecx], edx
    7. }
    8. }

    函数名:原子读值 / InterlockedRead

    返回值:返回原子现行值。

    1. inline
    2. int __InterlockedRead(volatile int* localtion1) noexcept {
    3. return __InterlockedCompareExchange(localtion1, 0, 0);
    4. }

  • 相关阅读:
    【云原生之Docker实战】使用Docker部署Lanraragi个人漫画管理器
    LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解
    Python自动化操作sqlite数据库
    ASP.NET Core - 缓存之分布式缓存
    路由配置与mongoose模型构建
    YOLOv7训练自己的VOC数据集
    数据结构刷题——栈(上)
    全景房屋装修vr可视化编辑软件功能及特点
    为什么C语言需要指定平台开发?
    传奇GOM引擎登录器配置教程
  • 原文地址:https://blog.csdn.net/liulilittle/article/details/126621563