最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2013年05月14日 15:26:23   作者:  
本篇文章是對Interlocked進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

在大多數(shù)計(jì)算機(jī)上,增加變量操作不是一個(gè)原子操作,需要執(zhí)行下列步驟:

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

       二:增加或減少該值。

       三:在實(shí)例變量中存儲該值。

在多線程環(huán)境下,線程會在執(zhí)行完前兩個(gè)步驟后被搶先。然后由另一個(gè)線程執(zhí)行所有三個(gè)步驟,當(dāng)?shù)谝粋€(gè)線程重新開始執(zhí)行時(shí),它覆蓋實(shí)例變量中的值,造成第二個(gè)線程執(zhí)行增減操作的結(jié)果丟失。

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

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

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


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

下面我們使用Interlocked.CompareExchange 實(shí)現(xiàn)求最大值的原子操作。

復(fù)制代碼 代碼如下:

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

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

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

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


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

在這里,計(jì)算可能會比較復(fù)雜,而不像上面的Math.Max一樣,所以可以使用委托調(diào)用的方式進(jìn)行封裝。

復(fù)制代碼 代碼如下:

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;
        }


基本原理和上面的一致。

相關(guān)文章

  • C# System.BadImageFormatException問題及解決

    C# System.BadImageFormatException問題及解決

    這篇文章主要介紹了C# System.BadImageFormatException問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • C#中的var關(guān)鍵字用法介紹

    C#中的var關(guān)鍵字用法介紹

    這篇文章介紹了C#中的var關(guān)鍵字用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • C#.Net ArrayList的使用方法

    C#.Net ArrayList的使用方法

    這篇文章主要介紹了C#.Net ArrayList的使用方法,使用動(dòng)態(tài)數(shù)組的優(yōu)點(diǎn)是可以根據(jù)用戶需要,有效利用存儲空間,需要的朋友可以參考下
    2015-10-10
  • C# log4net日志庫的用法小結(jié)

    C# log4net日志庫的用法小結(jié)

    log4net日志開源庫是用來控制日志文件大小,日志文件個(gè)數(shù),滾動(dòng)式覆蓋,自由控制日志打印等級,今天通過本文給大家介紹C# log4net日志庫的用法小結(jié),感興趣的朋友一起看看吧
    2021-10-10
  • C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn)

    C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn)

    本文主要介紹了C#創(chuàng)建及訪問網(wǎng)絡(luò)硬盤的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Winform中Treeview實(shí)現(xiàn)按需加載的方法

    Winform中Treeview實(shí)現(xiàn)按需加載的方法

    這篇文章主要介紹了Winform中Treeview實(shí)現(xiàn)按需加載的方法,針對大數(shù)據(jù)量的情況下非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • c#中l(wèi)ist.FindAll與for循環(huán)的性能對比總結(jié)

    c#中l(wèi)ist.FindAll與for循環(huán)的性能對比總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于c#中l(wèi)ist.FindAll與for循環(huán)的性能,文中通過詳細(xì)的示例代碼給大家介紹了這兩者之間的性能,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • C#實(shí)現(xiàn)俄羅斯方塊

    C#實(shí)現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)俄羅斯方塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C#使用AngleSharp庫解析html文檔

    C#使用AngleSharp庫解析html文檔

    這篇文章介紹了C#使用AngleSharp庫解析html文檔的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#?WPF中RadioButton控件的用法及應(yīng)用場景

    C#?WPF中RadioButton控件的用法及應(yīng)用場景

    在WPF應(yīng)用程序中,RadioButton控件是一種常用的用戶界面元素,本文主要介紹了C#?WPF中RadioButton控件的用法及應(yīng)用場景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評論

孟村| 登封市| 文登市| 湘乡市| 宁南县| 板桥市| 临漳县| 祁门县| 北京市| 杭锦后旗| 大足县| 上林县| 宁陕县| 鲜城| 大厂| 开阳县| 恩平市| 三明市| 潍坊市| 沙洋县| 定结县| 楚雄市| 远安县| 德清县| 普陀区| 永仁县| 内丘县| 手游| 湖南省| 新泰市| 视频| 临朐县| 巴楚县| 遂平县| 青州市| 山西省| 确山县| 台中县| 自贡市| 沙雅县| 张家川|