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。
volatile:将一个变量说明为volatile表示这个变量是“易变的”。假设一个变量会被其他引用改变。或在其他并行的任务中会被改变(比如中断服务程序),都要显式地说明为“volatile”,否则在编译器优化阶段会作出错误的推断,比如将这个变量读入寄存器以后。在没有对这个变量赋值曾经,会一直使用寄存器中的值。而实际上这个变量的值可能已经被一个指针引用改变了。或者是在中断服务程序中被改变了,以下这个样例说明这样的错误:
有一个变量T,在定时中断中每隔一个固定时间减一。然后在主程序中等待它减到0
unsigned char T;
void T0_int( void ) interrupt 1
{
...
T--;
...
}
int main( int )
{
...
T = 10;
while ( T != 0 ); /* 这在某些编译器中将成为一个死循环,而不是预想的等待一段时间 */
...
}
正确的写法应该是将第一句改为:
volatile unsigned char T;
InterLockedIncrement and InterLockedDecrement函数原理的更多相关文章
- win32的计数增减操作的原子操作--InterLockedIncrement和InterlockedDecrement
InterLockedIncrement and InterLockedDecrement 实现数的原子性加减. 什么是原子性的加减呢? 举个例子:如果一个变量 Long value =0; 首先说一 ...
- 不定参数函数原理以及实现一个属于自己的printf函数
一.不定参数函数原理 二.实现一个属于自己的printf函数 参考博文:王爽汇编语言综合研究-函数如何接收不定数量的参数
- map函数原理
# -*- coding: utf-8 -*- #python 27 #xiaodeng #map函数 #map函数会对一个序列对象中的每一个元素应用被传入的函数,并返回一个包含了所有函数调用结果的一 ...
- C# Async/Await异步函数原理
原理 与同步函数相比,CLR在执行异步函数时有几个不同的特点: 1. 并非一次完成,而且分多次完成 2. 并非由同一个线程完成,而是线程池每次动态分配一个线程来处理: 结合 ...
- Block、委托、回调函数原理剖析(在Object C语境)——这样讲还不懂,根本不可能!
开篇:要想理解Block和委托,最快的方法是搞明白“回调函数”这个概念. 做为初级选手,我们把Block.委托.回调函数,视为同一原理的三种不同名称.也就是说,现在,我们把这三个名词当成一回事.在这篇 ...
- 树状数组lowbit()函数原理的解释 x&(x^(x-1)) x&-x
树状数组lowbit()函数所求的就是最低位1的位置所以可以通过位运算来计算 树状数组通过 x&(x^(x-1)) 能够成功求出lowbit的原因: 首先设x=6,即110(2) 于是我们使 ...
- C函数原理
C语言作为面向过程的语言,函数是其中最重要的部分,同时函数也是C种的一个难点,这篇文章希望通过汇编的方式说明函数的实现原理. 栈结构与相关的寄存器 在计算中,栈是十分重要的一种数据结构,同时也是CPU ...
- C++虚函数原理
类中的成员函数分为静态成员函数和非静态成员函数,而非静态成员函数又分为普通函数和虚函数. Q: 为什么使用虚函数 A: 使用虚函数,我们可以获得良好的可扩展性.在一个设计比较好的面向对象程序中,大多数 ...
- php回调函数原理和实例
原理 自己调用自己 称之为“递归”,而不是回调 你也知道回调的关键是这个回既然是回,那么就有一个谁是主体的问题,因为回调是往回调用的意思我调用了函数A,而函数A在执行过程中调用了我提供的函数B,这个函 ...
随机推荐
- hdu 5630 Rikka with Chess
来自官方题解: AC代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream ...
- django 启动和请求
Django运行方式 调试模式 直接 python manage.py runserver python manage.py runserver python manage.py runserver ...
- [Python笔记][第三章Python选择与循环]
1月28日学习 Python选择与循环 选择结构 多分枝选择结构 if 表达式 1: 语句块 1 elif 表达式 2: 语句块 2 elif 表达式 3: 语句块 3 ... else : 语句块 ...
- C# 枚举运用"位"操作和"或"操作
定义: /// <summary> /// The js function type(the same as name). /// </summary> [Flags] pub ...
- HNOI2004 宠物收养所 解题报告
首先读完这题第一印象,是个裸题,很高兴.其次在打完代码之后,第二印象,很恶心,Treap的代码太长了,我今天下午敲了三遍,手都麻了. 废话不多说,正题.其实这个题不难,有几个点是很好的,首先,他的a值 ...
- 常用网站开发类Firefox扩展插件 (转)
作为一个 Web 开发人员,你几乎没有理由不喜欢Firefox,因为在Firefox下有很多专门针对开发的扩展插件,非常好用,这里就介绍一些常用的针对网站开发的FireFox扩展,供Web开发人员参考 ...
- tar.xz 文件如何解压
XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 我是在下载phpmyadmin的时候看到 ...
- windows----composer、laravel安装
环境要求:php+apache,并且将php的根目录配置到“环境变量”. 1.安装composer 使用cmd进入想要安装composer的目录执行如下命令,下载composer.phar文件: ph ...
- php composer使用
Composer-PHP中用来管理依赖(dependency) 定义 composer是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(librar ...
- class之cls
cls代表的是类本身,一般在静态方法中使用