用于线程同步的Interlocked系列函数主要有哪些

时间:2025-03-28 09:39:39

原子访问

通过Interlocked系列函数是 Windows API 提供的一组原子操作函数,用于在多线程环境中安全地操作共享变量。当我们执行这些Interlocked系列函数的时候 ,函数会对总线发出一个硬件信号,这个硬件信号可以防止CPU同一时刻访问同一个内存地址,从而大打到原子访问的目的。以下是一些常用的 Interlocked 系列函数:

1.    InterlockedIncrement:递增指定的变量。
2.    InterlockedDecrement:递减指定的变量。
3.    InterlockedExchange:将指定的变量设置为指定的值,并返回该变量的原值。
4.    InterlockedExchangeAdd:将指定的值加到指定的变量上,并返回该变量的原值。
5.    InterlockedCompareExchange:如果指定的变量的当前值等于指定的比较值,则将该变量设置为指定的值。
6.    InterlockedAnd:对指定的变量执行按位与操作。
7.    InterlockedOr:对指定的变量执行按位或操作。
8.    InterlockedXor:对指定的变量执行按位异或操作。

LONG InterlockedIncrement(
  _Inout_ LONG volatile *Addend
);

LONG InterlockedDecrement(
  _Inout_ LONG volatile *Addend
);

LONG InterlockedExchange(
  _Inout_ LONG volatile *Target,
  _In_    LONG          Value
);

LONG InterlockedExchangeAdd(
  _Inout_ LONG volatile *Addend,
  _In_    LONG          Value
);

LONG InterlockedCompareExchange(
  _Inout_ LONG volatile *Destination,
  _In_    LONG          Exchange,
  _In_    LONG          Comperand
);

LONG InterlockedAnd(
  _Inout_ LONG volatile *Destination,
  _In_    LONG          Value
);

LONG InterlockedOr(
  _Inout_ LONG volatile *Destination,
  _In_    LONG          Value
);

LONG InterlockedXor(
  _Inout_ LONG volatile *Destination,
  _In_    LONG          Value
);

下面是一个简单的示例代码:

#include <iostream>
#include <Windows.h>
#include <process.h>

int main()
{
	long value = 0;
	InterlockedIncrement(&value);//变量值加1
	std::cout << "Value: " << value << std::endl;//输出1

	InterlockedDecrement(&value);//变量值减1
	std::cout << "Value: " << value << std::endl;//输出0

	InterlockedExchange(&value, 10);//将变量值设置为10
	std::cout << "Value: " << value << std::endl;//输出10

	InterlockedExchangeAdd(&value, 5);//将变量值加5
	std::cout << "Value: " << value << std::endl;//输出15

	InterlockedCompareExchange(&value, 20, 15);//如果变量值等于15,则将变量值设置为20
	std::cout << "Value: " << value << std::endl;//输出20
    return 0;
}