_InterlockedAdd 内部函数

Microsoft 专用

当多线程拥有对共享变量的访问权限时,这些函数执行原子加法可确保成功完成操作。

语法

long _InterlockedAdd(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_acq(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_nf(
   long volatile * Addend,
   long Value
);
long _InterlockedAdd_rel(
   long volatile * Addend,
   long Value
);
__int64 _InterlockedAdd64(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_acq(
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_nf (
   __int64 volatile * Addend,
   __int64 Value
);
__int64 _InterlockedAdd64_rel(
   __int64 volatile * Addend,
   __int64 Value
);

参数

加数
[in, out] 指向要相加的整数的指针;由加法结果代替。


[in] 要相加的值。

返回值

两个函数都将返回加法结果。

要求

Intrinsic 体系结构
_InterlockedAdd ARM、ARM64
_InterlockedAdd_acq ARM、ARM64
_InterlockedAdd_nf ARM、ARM64
_InterlockedAdd_rel ARM、ARM64
_InterlockedAdd64 ARM、ARM64
_InterlockedAdd64_acq ARM、ARM64
_InterlockedAdd64_nf ARM、ARM64
_InterlockedAdd64_rel ARM、ARM64

头文件<intrin.h>

注解

_acq_rel 后缀的这些版本的函数可在获取或发布语义后执行互锁加法。 获取语义的意思是,在任何后续内存进行读取和写入之前,所有线程和处理器均能看见运算结果。 进入临界区时,获取十分有用。 发布语义的意思是,在运算结果自己显示出来之前,将强制所有内存的读取和写入对所有线程和处理器可见。 离开临界区时,发布十分有用。 带 _nf(“no fence”)后缀的内部函数不充当内存屏障。

这些例程只能用作内部函数。

示例: _InterlockedAdd

// interlockedadd.cpp
// Compile with: /Oi /EHsc
// processor: ARM
#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_InterlockedAdd)

int main()
{
        long data1 = 0xFF00FF00;
        long data2 = 0x00FF0000;
        long retval;
        retval = _InterlockedAdd(&data1, data2);
        printf("0x%x 0x%x 0x%x", data1, data2, retval);
}

输出:_InterlockedAdd

0xffffff00 0xff0000 0xffffff00

示例: _InterlockedAdd64

// interlockedadd64.cpp
// compile with: /Oi /EHsc
// processor: ARM
#include <iostream>
#include <intrin.h>
using namespace std;

#pragma intrinsic(_InterlockedAdd64)

int main()
{
        __int64 data1 = 0x0000FF0000000000;
        __int64 data2 = 0x00FF0000FFFFFFFF;
        __int64 retval;
        cout << hex << data1 << " + " << data2 << " = " ;
        retval = _InterlockedAdd64(&data1, data2);
        cout << data1 << endl;
        cout << "Return value: " << retval << endl;
}

输出:_InterlockedAdd64

ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff

结束 Microsoft 专用

另请参阅

编译器内部函数
与 x86 编译器冲突