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
- Windows并发&异步编程(2)原子操作Interlocked
- 【windows多线程】原子操作 Interlocked系列函数
- 多线程2:原子操作 Interlocked系列函数
- 原子操作Interlocked
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数 .
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数 .
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数
- 《Windows核心编程》---Interlocked原子访问系列函数
- 原子操作 Interlocked系列函数
- 原子操作 Interlocked系列函数
- 原子操作 Interlocked系列函数
- 并发编程之原子操作
- NYOJ--整数划分问题
- A
- WebStorm调试Electron
- KNN算法介绍
- Java小问题 4 sum=4+44+444+4444 解决源代码
- Windows并发&异步编程(2)原子操作Interlocked
- css背景色不填充边框,css的写法?
- Ubuntu的目录结构
- python——图片爬虫:爬取爱女神网站(www.znzhi.net)上的妹子图 基础篇
- 两个List<model>取差集
- Play framework如何使用play控制台
- MySQL技术内幕系列 电子书 作者: 姜承尧
- 关于ad10相关问题
- 数据结构之线性表