Interlocked(续)
来源:互联网 发布:青铜卡尺 知乎 编辑:程序博客网 时间:2024/06/04 17:54
Interlocked(续)
前言
前面已将主要用来给我扫扫盲,因为本屌才疏学浅,不懂的地方太多了,需要不停的扫盲,不停的学习,本屌并不不奢望能进步多大,只希望能在本屌的百分努力中,收获百分之一.这样本屌就很开心了,学如逆水行舟.
引入
在大多数计算机中,增加变量操作不是一个原子操作,需要执行下列步骤:
1.将实例变量中的值加载到寄存器中.
2.增加或减少该值
3.在实例变量中存储该值
在多线程的环境中,线程会在执行完前两个步骤后被抢走.然后由另一个线程执行所有三个步骤,当第一个线程重新开始执行的时候,它覆盖实例变量中的值,造成第二个线程执行增减操作的结果丢失.
Interlocked可以为多线程共享的变量提供原子操作.
1.Interlocked.Increment:以原子操作的形式递增指定变量的值并存储结果.
2.Interlocked.Decrement以原子操作的形式递减指定变量的值并存储结果.
3.Interlocked.Add以原子操作的形式,添加两个整数并用两者的和替换第一个整数.
但是Interlocked并没有为乘法,除法提供原子操作.那么如何实现乘法,除法,以及为其他一些非原子提供原子操作的支持呢?
关键就在于Interlocked.CompareExchange中,下面我们使用Interlocked.CompareExchange实现求最大值的原子操作
public static int Maximum(ref int target, int value) { int currentVal = target;//将target的当前值保存到currentVal中 int startVal, desireVal;//声明两个变量来记录操作开始前的值和期望的结果值 do { //将currentVal中的值保存到startVal中 //此时记录的是target在操作开始前的最初值 startVal = currentVal; //通过startVal进行复杂的计算,返回一个期望的结果 //在这里仅仅是返回两者的最大值 desireVal = Math.Max(startVal, value); /* * 线程可能在这里被抢占,target的值可能被改变 * 如果target的值被改变了,那么target和startVal的值就不相等 * 所以就不应该用desireVal替换target * 如果target的值没有改变,那么target和startVal的值就想等 * 使用desireVal替换target * 不管替换或者不替换,CompareExchange的返回值始终是target的值 * 所以currentVal的值现在是target的最新值 * * * * CompareWxchange:将target和startVal的值比较 * 相等则用desireVal替换, 否则则不替换 * 不管替不替换,返回的都是原来保存在target的中 */ currentVal = Interlocked.CompareExchange(ref target, desireVal, startVal); /* * 这里的判断条件是当target的起始值和最新值不相等的时候, * 说明target被修改了,所以继续下次判断 */ } while (startVal != currentVal); return desireVal; }
这段代码的核心就是:
currentVal=Interlocked.CompareExchange(ref target,desireVal,startVal)//将target的值和startVal的值比较,相等则是desireVal替换target,否则不替换//不管替换不替换,返回的都是原来保存在target的值.
0 0
- Interlocked(续)
- Interlocked 类
- InterLocked 锁
- InterLocked的几个函数
- Interlocked系列互锁函数
- Interlocked系列互锁函数
- 黑马程序员--interlocked(互锁)
- Interlocked Variable Access
- 自由锁(InterLocked)
- 浅谈Interlocked operations
- Interlocked Variable Access
- 原子操作Interlocked
- Interlocked系列函数
- Interlocked系列函数
- Interlocked 实现自旋锁
- Interlocked.Increment 方法 和Interlocked.Decrement 方法作用
- Interlocked 系列函数的实现
- 原子访问--- Interlocked系列函数
- you must supply a layout_height attribute——android开发之xml布局文件
- Tiny6410学习成果—视频采集小车(端程序)
- LAMP环境搭建
- Unity优化大全(九)之 Memory - Unity3D内部的内存
- 高仿煎蛋iOS项目基础配置(2)
- Interlocked(续)
- Apache源码分析
- 深入理解OAuth2.0协议
- 简述UIView、UIWindow和CALayer的理解
- EL函数以及自定义标签的应用
- Unix整理笔记——Unix基础——里程碑
- 第五章:循环
- 三分钟理解“享元模式”——设计模式轻松掌握
- Android JNI打印Log