Windows并发&异步编程(2)原子操作Interlocked

来源:互联网 发布:二手手机是那个软件 编辑:程序博客网 时间:2024/06/04 18:26

阅读过《操作系统》一书的人都知道“原子操作”这一概念。在计算机中,原子操作又称为原语,操作系统保证:“原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断。”。


原子操作可以是一个步骤,也可以是多个操作步骤,但是其执行期间不会有任何线程调度。


目录:

  • InterlockedIncrement
  • InterlockedDecrement
  • InterlockedExchangeAdd
  • InterlockedExchange
  • InterlockedCompareExchange
  • InterlockedExchangePointer
  • InterlockedCompareExchangePointer

在Windows编程中,主要原子操作有5个:加(减)、自增、自减、赋值(值/指针)、比较(值/指针)。

InterlockedIncrement

原子操作:自增

LONG InterlockedIncrement(      LPLONG lpAddend   // variable to increment);

自增,在C/C++里面又相当于,

i = i + 1;//i++;//++i;

为了保证其原子性,应该这样,
InterlockedIncrement(&g_count);

InterlockedDecrement

原子操作:自减

LONG InterlockedDecrement(      LPLONG lpAddend   // variable address    );

与自增相对的是自减,
InterlockedDecrement(&g_count);

InterlockedExchangeAdd

原子操作:加法(也可称为减法)

LONG InterlockedExchangeAdd (      LPLONG Addend,  // addend    LONG Increment  // increment value    );

在多线程编程中,一句简单的(加法操作)

g_count += 256L;

为了保证其原子性,必须使用系统原语来实现,
InterlockedExchange(&g_count, 256L);

加法减法,其实是互通的。如果将参数设置为负数则可实现减法,
InterlockedExchange(&g_count, -256L);

InterlockedExchange

原子操作:赋值

LONG InterlockedExchange(      LPLONG Target, // value to exchange    LONG Value     // new value    );

赋值操作,在程序中极为常见,想将值Value 赋值给全局变量Target。这里假设将256L赋值给g_count,

int g_count;g_count = 256L;

InterlockedExchange原语,可以在高并发编程中,安全的完成该任务,
InterlockedExchange(&g_count, 256L);

InterlockedCompareExchange

原子操作:比较

LONG InterlockedCompareExchange(       LPLONG Destination,  // destination address    LONG Exchange,       // exchange value    LONG Comperand       // value to compare    );

比较原语有3个参数,如果使用常规语句可以如此解释,

if (*Destination == Comperand){    *Destination = Exchange;}

这里,参数Destination是一个LPLONG指针,故使用if语句解释起来,加了一个取值符号(*)。
InterlockedCompareExchange(&g_count, 256L,-8L);

这句话表示:如果g_count的值与-8L相等,就将256L赋值给g_count。

InterlockedExchangePointer

原子操作:赋值(指针)

PVOID InterlockedExchangePointer(      PVOID *Target,  // value to exchange    PVOID Value     // new value    );

InterlockedCompareExchangePointer

原子操作:比较(指针)

PVOID InterlockedCompareExchangePointer (    PVOID *Destination,  // destination address    PVOID Exchange,      // exchange value    PVOID Comperand      // value to compare    );

本文源码:interlocked