a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

深入多線程之:深入分析Interlocked

2020-01-24 03:19:36
字體:
來源:轉載
供稿:網友

在大多數計算機上,增加變量操作不是一個原子操作,需要執行下列步驟:

       一:將實例變量中的值加載到寄存器中。

       二:增加或減少該值。

       三:在實例變量中存儲該值。

在多線程環境下,線程會在執行完前兩個步驟后被搶先。然后由另一個線程執行所有三個步驟,當第一個線程重新開始執行時,它覆蓋實例變量中的值,造成第二個線程執行增減操作的結果丟失。

Interlocked可以為多個線程共享的變量提供原子操作。

    Interlocked.Increment:以原子操作的形式遞增指定變量的值并存儲結果。
    Interlocked.Decrement以原子操作的形式遞減指定變量的值并存儲結果。
    Interlocked.Add以原子操作的形式,添加兩個整數并用兩者的和替換第一個整數

但是Interlocked并沒有為乘法,除法提供原子操作。那么如何實現乘法,除法,以及為其他的一些非原子操作提供原子操作的支持呢??


關鍵就在于Interlocked.CompareExchange 中,Jeffrey Richter把它叫做InterLocked Anything 模式。

下面我們使用Interlocked.CompareExchange 實現求最大值的原子操作。

復制代碼 代碼如下:

public static int Maximum(ref int target, int value)
        {
            int currentVal = target;   //將target的當前值保存到currentVal中
            int startVal, desiredVal;  //聲明兩個變量來記錄操作開始前的值和期望的結果值。

            do
            {
                startVal = currentVal; //將currentVal中的值保存到startVal中,此時記錄的是target在操作開始前的最初值。
                desiredVal = Math.Max(startVal, value); //通過startVal進行復雜的計算,返回一個期望的結果,在這里僅僅是返回兩者的最大值。

                //線程可能在這里被搶占,target的值可能被改變
                //如果target的值被改變了,那么target和startVal的值就不想等,所以就不應該用desiredVal替換target.
                //如果target的值沒有被改變,那么target和startVal的值就像等,使用desiredVal替換target.
                //不管替換或者不替換,CompareExchange的返回值始終是target的值,所以currentVal的值現在是target的最新值。

                //CompareExchange:將target和startVal的值比較,相等則用desiredVal替換,否則不操作,
                //不管替換還是不替換返回的都是原來保存在target的值。
                currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
            } while (startVal != currentVal); //當target的起始值和最新值不相等的時候,說明target被修改了,所以繼續下次判斷,否則退出循環。
            return desiredVal;
        }


這段代碼的核心就是:currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
// 將target的值和startVal的值比較,相等則用desiredVal替換target,否則不操作,
//不管替換還是不替換返回的都是原來保存在target的值。

在這里,計算可能會比較復雜,而不像上面的Math.Max一樣,所以可以使用委托調用的方式進行封裝。

復制代碼 代碼如下:

delegate int Morpher<TResult, TArgument>(int startValue, TArgument argument,
            out TResult morphResult);

        static TResult Morph<TResult, TArgument>(ref int target, TArgument argument,
            Morpher<TResult, TArgument> morpher)
        {
            TResult morphResult;

            int currentVal = target, startVal, desiredVal;

            do
            {
                startVal = currentVal;
                desiredVal = morpher(startVal, argument, out morphResult);
                currentVal = Interlocked.CompareExchange(ref target, desiredVal, startVal);
            } while (startVal != currentVal);

            return morphResult;
        }


基本原理和上面的一致。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天堂√在线观看一区二区 | 国产美女视频黄a视频免费 国产美女在线播放 | 91精品久久久久久久久久久久久久久 | 99国产精品99久久久久久 | 日本一区二区免费看 | 国产精品亚洲区 | 日韩中文在线视频 | 最新黄色av | 国产亚洲一区二区在线观看 | 欧美一二三四成人免费视频 | 久久久久久久久免费视频 | 一二三区精品 | 97精品超碰一区二区三区 | av男人的天堂网 | 银杏成人影院在线观看 | 亚洲精品18| 成人在线视频观看 | 日韩精品中文字幕在线播放 | 国产精品久久久久aaaa | 日韩在线高清视频 | 亚洲一区在线日韩在线深爱 | 九九九久久国产免费 | 天天干天天摸 | 成人av在线看 | 亚洲精品一区在线观看 | 国产超碰人人模人人爽人人添 | 国产精品国色综合久久 | 亚洲综人网 | 国产精品日韩 | 精品国偷自产国产一区 | 激情小视频网站 | 国产高清免费 | 欧美成人在线影院 | 欧美日韩一区二区视频在线观看 | 国产亚洲成av人片在线观看 | 国产精品有限公司 | 亚洲成av人片在线观看 | 国产午夜精品一区二区三区嫩草 | 国产精品无码专区在线观看 | 欧美色综合一区二区三区 | 伊人欧美在线 |