您的位置:首页 > 编程语言

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

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

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

目录:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐