Interlocked(续)

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值