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

首頁 > 編程 > C# > 正文

深入多線程之:解析線程的交會(Thread Rendezvous)詳解

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

在上篇文章中我們使用了Wait和Pulse 實現了Countdown

接下來我們可以使用剛剛寫的Countdown 類來實現兩個線程的交會。

復制代碼 代碼如下:

class Rendezvous
    {
        static object _locker = new object();
        static Countdown _countdown = new Countdown(2);

        public static void MainThread()
        {
            Random r = new Random();
            new Thread(Mate).Start(r.Next(1000));
            Thread.Sleep(r.Next(10000)); //主線程睡眠一段時間

            _countdown.Singnal(); //向_countdown注冊信號,告知主線程已經來了。
            _countdown.Wait();    //等待其他線程

            Console.WriteLine("Mate!");
        }

        static void Mate(object delay)
        {
            Thread.Sleep((int)delay);//線程睡眠。

            _countdown.Singnal(); //向_countdown注冊信號,告知線程已經來了。
            _countdown.Wait();   //等待其他線程。

            Console.WriteLine("Mate!");

        }
}


就像小時候去春游一樣,這里的_countdown就是老師,線程就是學生。

學生A早上睡覺,然后起床來到交會點,然后告訴老師,我來了,接著等待老師的出發命令,因為老師知道有兩個學生要去春游,所以現在只來了一個,還有一個沒有來,所以老師會讓學生A等待,阻塞。

學生B也是睡覺,接著也來到交會點,告訴老師,我也來了,然后等待老師的出發命令。

當學生B告訴老師我來了的時候,此時老師的剩余等待學生計數為0,所以老師告訴這兩個學生,你們可以出發了。

.net framework 4.0 提供了Barrier 的構造來實現線程交會的功能。如圖所示:

Thread1 調用SignalAndWait告知Barrier,我已經來了,然后阻塞。

Thread3調用SignalAndWait告知Barrier,我已經來了,然后阻塞。

Thread2 調用SignalAndWait告知Barrier,我已經來了,Barrier知道現在三個線程都來了,所以讓他們繼續并發執行。

Barrier的方法簡介:

    AddParticipants:增加參與者,也就是增加春游的人數。
    RemoveParticipant:減少參與者,可能某人肚子痛,不能參加春游了。
    SignalAndWait :參與者已經來了,并等待其他參與者的到來。

下面是使用Barrier的示例:

復制代碼 代碼如下:

static Barrier _barrier = new Barrier(3);//說明有三個參與者

        public static void Main()
        {
            new Thread(Speak).Start();
            new Thread(Speak).Start();
            new Thread(Speak).Start();
        }

        static void Speak()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.Write(i + " ");
                _barrier.SignalAndWait(); //告知參與者已經來了,等待其他參與者
            }
        }


輸出如下:

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4

Barrier 的另一個非常有用的特性是在每一個階段完成的時候你都可以執行一個post-phase 的action委托。

什么是階段呢??,階段就是參與者全部都到了的時候。

如果我們修改Barrier的構造函數如下:

static Barrier _barrier = new Barrier(3, (barrier) => Console.WriteLine());

//說明有三個參與者,并且每次三個參與者完成任務的時候執行Console.WriteLine方法.

那么我們的輸出如下所示:

0 0 0

1 1 1

2 2 2

3 3 3

4 4 4

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美日韩一区免费 | 日本精品中文字幕 | 成人一区二区三区视频 | 99精品国产99久久久久久97 | 国产精品不卡 | 色婷婷狠狠 | 操操操操操操操操操操操操操操 | 中文字幕一区二区三 | 四虎影视在线播放 | 日韩成人影院 | 亚洲一区二区视频 | 精品一二三区 | 日韩免费av一区二区 | 欧美级毛片 | 亚洲在线| 久久久www成人免费精品 | 99re国产精品视频 | 狠狠综合久久av一区二区小说 | 中国特黄毛片 | 综合网视频 | 久久久网 | 99精品欧美一区二区三区综合在线 | 国产一区二区三区久久99 | 国产精品久久久久久久久久久久午夜片 | 一区二区三区在线观看视频 | 亚洲精品国产9999久久久久 | 国产素人视频 | 国产探花| 亚洲一级黄色 | julia一区二区中文久久94 | 手机久久看片 | 精品一区二区久久 | 成人在线h | 午夜一区二区三区在线观看 | 三区中文字幕 | 国产性色av | www.久久99 | igao视频| 97在线免费观看 | 国产精品www | 性色av网 |