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

深入多線程之:雙向信號與競賽的用法分析

 更新時間:2013年05月14日 14:54:25   作者:  
本篇文章是對雙向信號與競賽的用法進行了詳細(xì)的分析介紹。需要的朋友參考下

雙向信號和競賽(Two-Way Signaling and Races)
 
Monitor.Pulse方法的一個重要特性是它是異步執(zhí)行的,這意味著調(diào)用pulse方法并不會阻塞自己等待Monitor.Pulse返回。如果任何一個線程在pulsed 對象上等待,它是不會阻塞的,換句話說,調(diào)用Monitor.Pulse對程序不會有什么作用,你可以認(rèn)為Monitor.Pulse方法被忽略了。
這樣Pulse提供了一個單向通信:一個 pulsing線程悄悄的向一個waiting 線程發(fā)送信號。
Pulse并不會返回一個值來告訴你waiting線程是否收到信號。

但是有時候我們需要知道waiting線程是否受到信號,例如下面的例子:

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

class Race
    {
        static readonly object _locker = new object();
        static bool  _go;
        public static void MainThread()
        {
            new Thread(SaySomething).Start();
            for (int i = 0; i < 5; i++)
            {
                lock (_locker)
                {
                    _go = true;
                    Monitor.PulseAll(_locker); //通知等待的隊列
                }
            }
        }
        static void SaySomething()
        {
            for (int i = 0; i < 5; i++)
            {
                lock (_locker)
                {
                    while (!_go) Monitor.Wait(_locker); //如果_go 為false,那么開始阻塞。
                    _go = false;
                    Console.WriteLine("Wassup?");
                }
            }
        }
    }

期待的輸出:
Wassup?
Wassup?
Wassup?
Wassup?
Wassup?

實際的輸出:

Wassup? (線程等待)
 
在SaySomething方法中,for循環(huán)執(zhí)行到while,此時_go為false,所以Monitor.Wait開始等待。在MainThread中,for循環(huán)設(shè)置_go為true。然后PulseAll.但是PulseAll方法是異步的。
所以在SaySomething線程被喚醒前,mainThread中的for循環(huán)可能已經(jīng)執(zhí)行完畢。所以SaySomething方法中的第一個Wait線程收到消息詞是_go為true,所以往下執(zhí)行,再次將_go字段設(shè)置為false。輸出”Wassup?”,但是下次循環(huán)由于_go為false,所以需要再次wait.所以實際的輸出打印了一個Wassup,然后開始等待。
我們需要主線程在每一次迭代中如果worker仍然在執(zhí)行上一個任務(wù),那么主線程阻塞。等到worker執(zhí)行完畢,那么主線程恢復(fù)執(zhí)行,然后執(zhí)行迭代。

我們可以增加一個_ready 標(biāo)志,從而控制主線程在設(shè)置_go 標(biāo)志之前worker線程已經(jīng)ready了。也就是說主線程在設(shè)置_go之前,會等待worker完成任務(wù),然后等待worker將ready設(shè)為true,當(dāng)worker將ready設(shè)置為true后,通過pulse來通知主線程。
復(fù)制代碼 代碼如下:

class Race
    {
        static readonly object _locker = new object();
        static bool _ready, _go;
        public static void MainThread()
        {
            new Thread(SaySomething).Start();
            for (int i = 0; i < 5; i++)
            {
                lock (_locker)
                {
                    while (!_ready) Monitor.Wait(_locker); //如果worker的ready為false,則等待worker。
                    _ready = false; //重置標(biāo)志
                    _go = true;
                    Monitor.PulseAll(_locker);
                }
            }
        }
        static void SaySomething()
        {
            for (int i = 0; i < 5; i++)
            {
                lock (_locker)
                {
                    _ready = true; //將ready設(shè)置為true
                    Monitor.PulseAll(_locker); //通知主線程,worker已經(jīng)ready了,可以執(zhí)行任務(wù)了。
                    while (!_go) Monitor.Wait(_locker);
                    _go = false;
                    Console.WriteLine("Wassup?");
                }
            }
        }
    }

相關(guān)文章

  • C#中兩個byte如何相加

    C#中兩個byte如何相加

    可能有的看到這個題目就會覺得這不簡單嗎?直接用+號相加就行了,可是當(dāng)你實際操作運行的時候就會發(fā)現(xiàn)有錯誤了,那么是什么錯誤?那該如何讓C#中兩個byte相加呢?通過下面這篇文章來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • Unity自定義編輯器界面(Inspector界面)

    Unity自定義編輯器界面(Inspector界面)

    這篇文章主要為大家詳細(xì)介紹了Unity自定義編輯器界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C#實現(xiàn)文件壓縮與解壓的方法示例【ZIP格式】

    C#實現(xiàn)文件壓縮與解壓的方法示例【ZIP格式】

    這篇文章主要介紹了C#實現(xiàn)文件壓縮與解壓的方法,結(jié)合具體實例形式分析了C#針對文件進行zip格式壓縮與解壓縮的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • C#中實現(xiàn)PriorityQueue優(yōu)先級隊列的代碼

    C#中實現(xiàn)PriorityQueue優(yōu)先級隊列的代碼

    這篇文章主要介紹了C#中PriorityQueue優(yōu)先級隊列的實現(xiàn),構(gòu)造初始化這部分主要介紹關(guān)鍵的字段和方法,比較器的初始化以及堆的初始化,需要的朋友可以參考下
    2021-12-12
  • 詳解WPF雙滑塊控件的使用和強制捕獲鼠標(biāo)事件焦點

    詳解WPF雙滑塊控件的使用和強制捕獲鼠標(biāo)事件焦點

    這篇文章主要為大家詳細(xì)介紹了WPF中雙滑塊控件的使用和強制捕獲鼠標(biāo)事件焦點的實現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下
    2022-07-07
  • 最新評論

    开原市| 新乡县| 浮山县| 新巴尔虎左旗| 正蓝旗| 万宁市| 青川县| 咸阳市| 葵青区| 绥德县| 西畴县| 碌曲县| 马公市| 平昌县| 会理县| 平邑县| 大丰市| 房山区| 大足县| 潜山县| 女性| 西城区| 合川市| 肇州县| 清涧县| 临沂市| 马公市| 潢川县| 平谷区| 万源市| 襄汾县| 永顺县| 疏勒县| 临安市| 镇宁| 义马市| 玉田县| 扶风县| 康平县| 平江县| 萨嘎县|