Windows并发&异步编程(2)原子操作Interlocked
2017-07-15 17:27
423 查看
阅读过《操作系统》一书的人都知道“原子操作”这一概念。在计算机中,原子操作又称为原语,操作系统保证:“原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断。”。
原子操作可以是一个步骤,也可以是多个操作步骤,但是其执行期间不会有任何线程调度。
目录:
InterlockedIncrement
InterlockedDecrement
InterlockedExchangeAdd
InterlockedExchange
InterlockedCompareExchange
InterlockedExchangePointer
InterlockedCompareExchangePointer
在Windows编程中,主要原子操作有5个:加(减)、自增、自减、赋值(值/指针)、比较(值/指针)。
自增,在C/C++里面又相当于,
为了保证其原子性,应该这样,
InterlockedIncrement(&g_count);
与自增相对的是自减,
InterlockedDecrement(&g_count);
在多线程编程中,一句简单的(加法操作)
g_count += 256L;
为了保证其原子性,必须使用系统原语来实现,
InterlockedExchange(&g_count, 256L);
加法减法,其实是互通的。如果将参数设置为负数则可实现减法,
InterlockedExchange(&g_count, -256L);
赋值操作,在程序中极为常见,想将值Value 赋值给全局变量Target。这里假设将256L赋值给g_count,
InterlockedExchange原语,可以在高并发编程中,安全的完成该任务,
InterlockedExchange(&g_count, 256L);
比较原语有3个参数,如果使用常规语句可以如此解释,
这里,参数Destination是一个LPLONG指针,故使用if语句解释起来,加了一个取值符号(*)。
InterlockedCompareExchange(&g_count, 256L,-8L);
这句话表示:如果g_count的值与-8L相等,就将256L赋值给g_count。
本文源码:interlocked
原子操作可以是一个步骤,也可以是多个操作步骤,但是其执行期间不会有任何线程调度。
目录:
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线程(三)原子操作Interlocked系列函数
- 【windows多线程】原子操作 Interlocked系列函数
- Windows并发&异步编程(0)创建、终止进程
- Windows并发&异步编程(1)JAVA&多线程
- windows线程同步-原子操作-Interlocked系列函数(用户模式)
- 顺序性,一致性,原子性:现代多核体系结构与原子操作·CAS与自旋锁·自旋锁与并发编程的原语·语句原子性和编程逻辑的原子性·行锁与数据库事务原子性·binlog与数据库同
- Windows并发&异步编程(3)临界区Critical Section
- java并发:线程同步机制之Volatile关键字&原子操作Atomic
- Linux 设备驱动 ====> 并发控制 --- 原子操作
- 理解并发编程的几种"性" -- 可见性,有序性,原子性 http://blog.sina.com.cn/s/blog_4adc4b090102whzx.html
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- Java并发机制底层——原子操作的实现原理
- <PY><Oracle>Windows下cx_Oracle配置 操作SQL
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
- 实战Java高并发程序设计-07原子操作
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- Java多线程编程--(6)学习Java5.0 并发编程包--原子操作的一些类型
- linux并发控制之原子操作
- OpenGL高级特性之利用Image内存模型&计算着色器&原子操作实现(直方图模型)通用计算
- <Windows下打包>InstallShield简单操作