InterLockedIncrement   举个例子:如果一个变量 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 能够保证在一个线程访问变量时其它线程不能访问。   例:如果 static long addref=0; 则 InterlockedIncrement(&addref); 后 addref=1   用于增减变量的并不是常用的Inc/Dec过程,而是用了InterlockedIncrement/InterlockedDecrement这一对过程,它们实现的功能完全一样,都是对变量加一或减一。但它们有一个最大的区别,那就是InterlockedIncrement/InterlockedDecrement是线程安全的。即它们在多线程下能保证执行结果正确,而Inc/Dec不能。或者按操作系统理论中的术语来说,这是一对“原语”操作。以加一为例来说明二者实现细节上的不同:   一般来说,对内存数据加一的操作分解以后有三个步骤:   1、 从内存中读出数据   2、 数据加一   3、 存入内存   现在假设在一个两个线程的应用中用Inc进行加一操作可能出现的一种情况:   1、 线程A从内存中读出数据(假设为3)   2、 线程B从内存中读出数据(也是3)   3、 线程A对数据加一(现在是4)   4、 线程B对数据加一(现在也是4)   5、 线程A将数据存入内存(现在内存中的数据是4)   6、 线程B也将数据存入内存(现在内存中的数据还是4,但两个线程都对它加了一,应该是5才对,所以这里出现了错误的结果)   而用InterlockIncrement过程则没有这个问题,因为所谓“原语”是一种不可中断的操作,即操作系统能保证在一个“原语”执行完毕前不会进行线程切换。所以在上面那个例子中,只有当线程A执行完将数据存入内存后,线程B才可以开始从中取数并进行加一操作,这样就保证了即使是在多线程情况下,结果也一定会是正确的。

InterlockedIncrement相关推荐

  1. InterlockedIncrement函数详解

    InterLockedIncrement and InterLockedDecrement 实现数的原子性加减.什么是原子性的加减呢? 举个例子:如果一个变量 Long value =0; 首先说一下 ...

  2. CString工作原理和常见问题分析

    关于Cstring 类 版权所有© Stevencao@benq.com 2003-11-6 转自:http://blog.csdn.net/laiyiling/archive/2004/10/05/ ...

  3. Delphi中的线程类

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

  4. boost asio io_service学习笔记

    转自:http://hi.baidu.com/jrckkyy/blog/item/e86835d61e60722506088b6a.html 构造函数 构造函数的主要动作就是调用CreateIoCom ...

  5. (转载博文)VC++API速查

    窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...

  6. 37 windows_37_Thread_InterLock 线程-原子锁

    windows_37_Thread_InterLock 线程-原子锁 // windows_37_Thread_InterLock.cpp : 定义控制台应用程序的入口点. // #include & ...

  7. Windows内核执行体对象管理器的操作过程与分析

    我之前写过一个有关于对象管理的读书笔记.但是这篇文章与前面的不同,这是我个人对对象管理器到底是什么的一个分析,而且也是直接对WRK代码进行的阅读. 执行体对象即我们通常所言的内核对象,我们知道Wind ...

  8. c 初始化char**_CC++|指针详述及实例分析

    指针是C语言中的精华,也是一把双刃剑,关系到安全和效率. 1 系统内存布局 2 存储变量的内存地址 3 指针定义:变量,地址,类型(宽度) 4 指针声明 5 &与*运算符 6 定义指针与解引用 ...

  9. [转]线程安全 c/c++

    转自 http://www.cppblog.com/ivenher/articles/15815.html 对于多线程编程,很多人概念不清,写代码的时候要么是处处加锁,影响性能不说,还容易莫名其妙的死 ...

最新文章

  1. mysql简拼_mysql实现汉字换拼音,及汉字转简拼
  2. 速看!高校开学返校的40个最新信息
  3. mysql 求数据的长度_mysql 如何求数据的长度
  4. java indexof int_Java Stack indexOf(Object, int)用法及代码示例
  5. 显示部分x_Linux 黑话解释:什么是显示服务器,用来做什么? | Linux 中国
  6. P4495-[HAOI2018]奇怪的背包【数论,dp】
  7. 【C++深度剖析教程26】父子间的冲突
  8. SQL SERVER 2008 中分页方法
  9. 关于VM虚拟机与主机不能互PING的一种可能的原因
  10. matlab显示和输出语句,matlab输出语句是什么,
  11. IT/互联网:盘点 2020 年收入最高的10大 IT 职位!你差多少?
  12. Unity中实现3D拾取功能及其原理
  13. Python 爬虫--下载音乐
  14. 计算机重装系统后黑屏,电脑重装系统后黑屏怎么办
  15. 固定贴片电阻器封装尺寸
  16. 构建SaaS化平台产品的建议
  17. SuperMap Hi-Fi 3D SDK 11i(2022) for Unity插件开发——选中对象隐藏
  18. 电商数据库详细设计说明书
  19. 新希望美好辣子蜀黍小火锅招商
  20. Apache配置及应用

热门文章

  1. NHibernate学习系列之一
  2. 演示FilterConfig接口的getInitParameter(String name)方法
  3. openwrt打印机支持列表_共享打印机的三种安装连接方法
  4. mysql是bsd协议吗_freebsd下实现mysql的自动备份
  5. ubuntu安装python_与你分享Ubuntu修改源和安装pycharm
  6. python读取文件名包含某字符的文件_python 读写文件时判断文件名是否包含某字符串...
  7. 电商美工需要的优质PSD素材,减少设计师75%办公加班时间
  8. UI实用素材| 工作管理、日程日历 专辑,总有一款符合设计师风格
  9. linux open dev/tty0 receive_buf,书写基于内核的linux键盘纪录器(p9-0e)(3)
  10. python判断列表维度_如何输出python中list的维度