函数原型如下:(在不同编译器上参数可能写的不一样,不过底层是一样的)
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说了一个关于这个函数的字节对齐,这个没遇到过,再看