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

原子访问

通过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;
}