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

深入多線程之:用Wait與Pulse模擬一些同步構(gòu)造的應(yīng)用詳解

 更新時間:2013年05月14日 15:02:59   作者:  
本篇文章是對用Wait與Pulse模擬一些同步構(gòu)造的應(yīng)用進行了詳細(xì)的分析介紹,需要的朋友參考下

你可能在上篇文章中《深入多線程之:雙向信號與競賽的用法分析》注意到了這個模式:兩個Waiting 循環(huán)都要下面的構(gòu)造:

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

lock(_locker)
{
        while(!_flag) Monitor.Wait(_locker);
        _flag = false;
}


在這里_flag被另一線程設(shè)置為true。這是,從作用上講,這里在模仿AutoResetEvent。如果我們將 _flag = false;去掉,那么我們就得到了一個基本的ManualResetEvent.

讓我們使用Wait和Pulse來為ManualResetEvent完成剩余的代碼吧。

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

readonly object _locker = new object();
        bool _signal;

        void WaitOne()
        {
            lock (_locker)
            {
                while (!_signal) Monitor.Wait(_locker);
            }
        }

        void Set()
        {
            lock (_locker) { _signal = true; Monitor.PulseAll(_locker); }
        }

        void Reset() { lock (_locker) _signal = false; }


在這里使用PulseAll,是因為可能有很多阻塞的線程。

如果在WaitOne方法中增加_signal=false就可以簡單的模擬AutoResetEvent.例如:

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

void WaitOne()
        {
            lock (_locker)
            {
                while (!_signal) Monitor.Wait(_locker);
                _signal = false; //實現(xiàn)自動關(guān)閉功|能
            }
        }

然后在Set方法中,將PulseAll修改為Pulse

Lock(_locker) {_signal = true; Monitor.Pulse(_locker);}

如果使用的是int類型的_signal 標(biāo)志,那么我們可以得到一個最基本的Semaphore.

Waiting Queues and PulseAll

當(dāng)多余一個線程在同一個對象上面等待的時候,一個 “等待隊列(waiting queue)” 就形成了。

每一次調(diào)用Pulse都會釋放在”等待隊列”頭部的一個線程。下面的圖形象的展示了這一點:

 

線程調(diào)用Monitor.Enter 進入ReadyQueue. 等待獲取鎖,成功獲取鎖后,如果正常的執(zhí)行,那么之后會調(diào)用Monitor.Exit退出,

否則如果獲取了鎖之后發(fā)現(xiàn)需要等待其他的線程或者是其他阻塞條件,那么調(diào)用Wait方法,就進入了等待隊列,

當(dāng)?shù)却木€程完成并調(diào)用Pulse后,處在WaitingQueue頭部的線程就被 Pulse了,等待CPU調(diào)度 。之后再次進入Ready Queue,重新獲取鎖。


Countdown

借助Wait和Pulse,我們可以實現(xiàn)CountdownEvent的主要功能。例如:

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

class Countdown
    {
        object _locker = new object();
        int _value; //使用_value來計數(shù)

        public Countdown() { }
        public Countdown(int initialCount) { _value = initialCount; }

        public void Singnal() { AddCount(-1); } //將計數(shù)減一

        public void AddCount(int amount)
        {
            lock (_locker)
            {
                _value += amount; //將計數(shù)增加或減少
                if (_value <= 0) Monitor.PulseAll(_locker);//如果value<=0,說明所有等待的任務(wù)都完成了。
            }
        }

        public void Wait()
        {
            lock (_locker)
            {
                //只要計數(shù) > 0 就等待。
                while (_value > 0)
                {
                    Monitor.Wait(_locker);
                }
            }
        }
}


這和我們上次的代碼幾乎一致,只是這次我們的阻塞條件基于一個整型_value標(biāo)志。

相關(guān)文章

  • C#計算字符串相似性的方法

    C#計算字符串相似性的方法

    這篇文章主要介紹了C#計算字符串相似性的方法,實例分析了C#計算字符串相似性的原理與算法實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#簡單的通用基礎(chǔ)字典實現(xiàn)方法

    C#簡單的通用基礎(chǔ)字典實現(xiàn)方法

    這篇文章主要介紹了C#簡單的通用基礎(chǔ)字典實現(xiàn)方法,包含了字典的索引、記錄、回調(diào)與查詢等技巧,需要的朋友可以參考下
    2014-12-12
  • C# SQLite序列操作實現(xiàn)方法詳解

    C# SQLite序列操作實現(xiàn)方法詳解

    這篇文章主要介紹了C# SQLite序列操作實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了C#實現(xiàn)SQLite序列操作的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • C#實現(xiàn)Json轉(zhuǎn)Unicode的方法

    C#實現(xiàn)Json轉(zhuǎn)Unicode的方法

    這篇文章主要介紹了C#實現(xiàn)Json轉(zhuǎn)Unicode的方法,可實現(xiàn)輸入為帶有json格式的文本,輸出正常文本的功能,需要的朋友可以參考下
    2014-09-09
  • C#自定義導(dǎo)出數(shù)據(jù)到Excel的類實例

    C#自定義導(dǎo)出數(shù)據(jù)到Excel的類實例

    這篇文章主要介紹了C#自定義導(dǎo)出數(shù)據(jù)到Excel的類,實例分析了C#操作Excel的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#使用Exchange實現(xiàn)發(fā)送郵件

    C#使用Exchange實現(xiàn)發(fā)送郵件

    最近項目中需要用到exchange的操作,所以本文就參照msdn弄了一個簡單的C#操作類,實現(xiàn)了發(fā)送郵件和拉取收件箱的功能,感興趣的小伙伴可以了解下
    2023-10-10
  • 深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程(上)

    深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程(上)

    這篇文章主要介紹了如何學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程的相關(guān)知識,文中講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# FileStream簡單介紹和使用

    C# FileStream簡單介紹和使用

    這篇文章主要為大家詳細(xì)介紹了C# FileStream基本功能和使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Unity實現(xiàn)旋轉(zhuǎn)扭曲圖像特效

    Unity實現(xiàn)旋轉(zhuǎn)扭曲圖像特效

    這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)旋轉(zhuǎn)扭曲圖像特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#中Class的實例化過程詳解

    C#中Class的實例化過程詳解

    文章詳細(xì)闡述了C#中類的成員,包括靜態(tài)字段、靜態(tài)構(gòu)造函數(shù)、實例字段等的初始化順序,在無繼承情況下,實例化分為聲明時初始化和構(gòu)造函數(shù)中初始化兩種,分別有明確的執(zhí)行順序,需要的朋友可以參考下
    2024-09-09

最新評論

鄂托克前旗| 托克逊县| 平阳县| 德清县| 巴彦淖尔市| 哈密市| 台东县| 道真| 广水市| 江油市| 许昌市| 杭锦旗| 湘乡市| 南皮县| 宜昌市| 万山特区| 赤水市| 手游| 濉溪县| 沾益县| 阳高县| 翼城县| 富裕县| 寿宁县| 祁东县| 仪陇县| 石林| 镇坪县| 阜城县| 商河县| 修文县| 黔江区| 泽普县| 岳阳市| 吕梁市| 曲松县| 平和县| 建平县| 沅陵县| 长阳| 五指山市|