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...函数有必要提供。
--------------------- 
作者:zhongguoren666 
来源:CSDN 
原文:https://blog.csdn.net/zhongguoren666/article/details/7541778 
版权声明:本文为博主原创文章,转载请附上博文链接!

InterlockedIncrement函数详解相关推荐

  1. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  2. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  3. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  4. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  5. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  6. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  7. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  8. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

  9. scanf函数详解与缓冲区

    1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0. 函数功能: sca ...

最新文章

  1. Memcached, Redis, MongoDB区别
  2. pytorch 数据加载为python提供了cpu全速跑跑其他任务的能力
  3. EOS账户系统(7)权限评估
  4. Equals 和 == 的区别
  5. 进入正在运行状态中的Docker容器
  6. Java的Kafka:构建安全,可扩展的消息传递应用程序
  7. 【渝粤题库】广东开放大学企业标准化 形成性考核
  8. OpenCV 像素的读取与操作
  9. Redis HyperLogLog 是什么?这些场景使用它~
  10. 【英语学习】【WOTD】finicky 释义/词源/示例
  11. input传给java_java inputstream 传递给 py 处理
  12. UVA516 POJ1365 LA5533 ZOJ1261 Prime Land【欧拉筛法】
  13. 分享一波恋爱社交APP源码,真好~
  14. 手机wifi已连接但无法访问互联网_我们的手机WiFi出现“已连接但无法上网”时咋办?...
  15. linux请求超时 ping_linux下ping命令使用详解
  16. Ubantu18.04
  17. 再记公式弱爆了!用ChatGPT处理Excel问题,效率狂升
  18. FP、FN、TP、TN、精确率(Precision)、召回率(Recall)、准确率(Accuracy)是什么意思
  19. ps的选区和相关工具
  20. python中pip安装、升级包用法详解

热门文章

  1. Spring 5 新增全新的reactive web框架:webflux
  2. 身份验证——《跟我学Shiro》
  3. 也许,DOM 不是答案
  4. JNI : Java程序调用C方法
  5. JAVA多线程:线程创建过程以及生命周期总结
  6. java2d游戏代码_Java 2D游戏图形
  7. 数据中心机房谐波治理
  8. VMware发布新版vSphere6.5虚拟化平台,助力企业数字化转型
  9. des解密 given final_真相解密创新Aurvana Live SE评测怎么样?【使用一个月后感受实情爆料!!!...
  10. 吉林电子计算机学校学费多少,收费标准_吉林工商学院学费介绍_高考院校库