windows下的原子操作函数InterlockedCompareExchange的用法

it2025-11-18  4

函数原型如下:(在不同编译器上参数可能写的不一样,不过底层是一样的)

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说了一个关于这个函数的字节对齐,这个没遇到过,再看

 

最新回复(0)