函数原型如下:(在不同编译器上参数可能写的不一样,不过底层是一样的)
InterlockedCompareExchange ( __inout LONG volatile *Destination, __in LONG Exchange, __in LONG Comperand );
头文件:
可以是#include<window.h>,因为在里面有一个#define InterlockedCompareExchange _InterlockedCompareExchange,别的版本不知道,vs2015是这样的
参数:
Destination:一个指向要设置值的指针
Exchange:要设置的值
Comparand:跟plDestination指向的值进行比较的值。
返回值:
Destination的初始值。
函数作用:
若Destination指向的值跟Comparand相同,则将Destination指向的值设置为Exchange。否则,不执行别的操作。不管你在函数里执行什么操作,返回值始终是Destination
代码:
#include "stdafx.h" #include<iostream>
#include<process.h> //#include<winnt.h> #include<windows.h>
using namespace std; long logon = 1; long logons = logon;
void test(void*) { logon = 1; } int main() { _beginthread(test, 0, NULL);
long l= InterlockedCompareExchange(&logon, 0, logons);
while (!l) Sleep(1000);
return 0; }
l的值始终是最开始的设置的logon的值1。
如果前面的long logon = 1;为long Logon=0;则返回值就是0,无论在InterlockedCompareExchange的logon和logons是否相等
其他的原子操作可以看:Synchronization Functions里的Interlocked Functions
在https://www.javaroad.cn/questions/141449说了一个关于这个函数的字节对齐,这个没遇到过,再看
