win32的计数增减操作的原子操作--InterLockedIncrement和InterlockedDecrement
来源:互联网 发布:物理仿真软件 编辑:程序博客网 时间:2024/05/23 14:07
InterLockedIncrement and InterLockedDecrement
实现数的原子性加减。
什么是原子性的加减呢?
举个例子:如果一个变量 Long value =0;
首先说一下正常情况下的加减操作:value+=1;
1:系统从Value的空间取出值,并动态生成一个空间来存储取出来的值;
2:将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束。
如果此时有两个Thread ,分别记作threadA,threadB。
1:threadA将Value从存储空间取出,为0;
2:threadB将Value从存储空间取出,为0;
3:threadA将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束,Value=1。
4:threadB将取出来的值和1作加法,并且将和放回Value的空间覆盖掉原值。加法结束,Value=1。
最后Value =1 ,而正确应该是2;这就是问题的所在,InterLockedIncrement 能够保证在一个线程访问变量时其它线程不能访问。同理InterLockedDecrement。
LONG InterlockedDecrement(
LPLONG lpAddend // variable address
);
属于互锁函数,用在同一进程内,需要对共享的一个变量,做减法的时候,
防止其他线程访问这个变量,是实现线程同步的一种办法(互锁函数)
首先要理解多线程同步,共享资源(同时访问全局变量的问题),否则就难以理解。
result = InterlockedDecrement(&SomeInt)
如果不考虑多线程其实就是 result = SomeInt - 1;
但是考虑到多线程问题就复杂了一些。就是说如果想要得到我预期的结果并不容易。
result = SomeInt - 1;
举例说:
SomeInt如果==1;
预期的结果result当然==0;
但是,如果SomeInt是一个全程共享的全局变量情况就不一样了。
C语言的"result = SomeInt - 1;"
在实际的执行过程中,有好几条指令,在指令执行过程中,其它线程可能改变SomeInt值,使真正的结果与你预期的不一致。
所以InterlockedDecrement(&SomeInt)的执行过程是这样的
{
__禁止其他线程访问 (&SomeInt) 这个地址
SomeInt --;
move EAX, someInt; // 设定返回值,C++函数的返回值 都放在EAX中,
__开放其他线程访问 (&SomeInt) 这个地址
}
但是实际上只需要几条指令加前缀就可以完成,以上说明是放大的。
你也许会说,这有必要吗? 一般来说,发生错误的概率不大,但是防范总是必要的
如果不考虑多线程
result = InterlockedDecrement(&SomeInt);
就是result = SomeInt - 1;
如果SomeInt==1,result一定==0;
但是,在多线程中如果SomeInt是线程间共享的全局变量,情况就不那么简单了。
result = SomeInt - 1;
在CPU中,要执行好几条指令。在指令中间有可能SomeInt被线程修改。那实际的结果就不是你预期的结果了。
InterlockedDecrement(&SomeInt)
放大的过程,如下:
{
__禁止其他线程访问 &SomeInt 地址;
SomeInt --;
/////其他线程不会在这里修改SomeInt值。 !!!!!!
mov EAX, SomeInt; //C++ 函数返回值 总放在EAX中。
__开放其他线程访问 &SomeInt 地址;
}
实际的CPU执行过程只有几条加前缀的指令(586指令)
你会说,有必要吗? 出错的概率不大,但是错误总是需要防范的。当然可以用其他多线程机制实现,但是都没有这样简洁,所以Interlocked...函数有必要提供。
- win32的计数增减操作的原子操作--InterLockedIncrement和InterlockedDecrement
- InterlockedIncrement和InterlockedDecrement的妙用
- InterlockedIncrement和InterlockedDecrement的妙用
- InterlockedIncrement和InterlockedDecrement的妙用
- InterlockedIncrement和InterlockedDecrement是做什么用的
- InterLockedIncrement 和 InterLockedDecrement
- 使用 InterlockedIncrement/InterlockedDecrement 的一个误区
- 多线程环境下,基本增减赋值操作的原子性实验[atomic,mutex]
- InterLockedIncrement 和 InterLockedDecrement处理线程访问
- WINCE的原子操作
- 互锁的原子操作
- 原子变量的操作
- gcc的原子操作
- 内核的原子操作
- sqlite3的原子操作
- boost的原子操作
- c++ ++ ---的原子操作
- 原子操作的好处
- jquery缓存
- 文件流操作两种方法比较
- sql server 2000/2005/2008 判断存储过程、触发器、视图是否存在并删除
- struts2学习笔记(二)——类型转换
- 文思创新笔试题一
- win32的计数增减操作的原子操作--InterLockedIncrement和InterlockedDecrement
- System.getProperty()
- Java Socket现实简单的HTTP服务
- Linux中的spinlock和mutex 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-
- linux 进程间通信详解
- 如何增加虚拟机ubuntu的硬盘
- 怎样用英语安慰人
- Java Socket发送与接收HTTP消息简单实现
- 在linux中安装应用程序时出现的问题