亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#并行編程-線程同步原語

2019-11-17 02:56:21
字體:
來源:轉載
供稿:網友

C#并行編程-線程同步原語

菜鳥學習并行編程,參考《C#并行編程高級教程.PDF》,如有錯誤,歡迎指正。

目錄

  • C#并行編程-相關概念

  • C#并行編程-Parallel

  • C#并行編程-Task

  • C#并行編程-并發集合

  • C#并行編程-線程同步原語

  • C#并行編程-PLINQ:聲明式數據并行

背景

有時候必須訪問變量、實例、方法、屬性或者結構體,而這些并沒有準備好用于并發訪問,或者有時候需要執行部分代碼,而這些代碼必須單獨運行,這是不得不通過將任務分解的方式讓它們獨立運行。

當任務和線程要訪問共享的數據和資源的時候,您必須添加顯示的同步,或者使用原子操作或鎖。

之前的.NET Framework提供了昂貴的鎖機制以及遺留的多線程模型,新的數據結構允許細粒度的并發和并行化,并且降低一定必要的開銷,這些數據結構稱為輕量級同步原語。

這些數據結構在關鍵場合下能夠提供更好的性能,因為它們能夠避免昂貴的鎖機制,如果在等待時間不短的情況下使用它們,這些原語會增加額外的開銷。

如果您需要特定的執行順序,可以通過添加顯示同步來實現。

同步原語

.NET Framework 4在現在的System.Threading命名空間中提供了6個同步原語,通過這個命名空間可以訪問遺留的線程類、類型和枚舉,還提供了新的基于任務的編程模型及特定情形緊密相關的數據結構

Barrier 使多個任務能夠采用并行方式依據某種算法在多個階段中協同工作 通過屏障

CountdownEvent 表示在計數變為0時處于有信號狀態的同步基元 通過信號機制

ManualResetEventSlim允許很多任務等待直到另一個任務手工發出事件句柄,當預計等待時間很短的時候,ManualResetEventSlim 的性能比對應的重量級ManualResetEvent的性能要高。通過信號機制

SemaphoreSlim 限制對可同時訪問資源或資源池的線程數,比對應的Semaphore性能要高 通過信號機制

SpinLock 提供一個相互排斥鎖基元,在該基元中,嘗試獲得鎖的線程將在重復檢查的循環中等待,直至該鎖變為可用為止。

SpinWait 提供對基于自旋的等待的支持。

通過屏障同步并發任務 Barrier

當在需要一組任務并行地運行一連串的階段,但是每一個階段都要等待其他任務完成前一階段之后才能開始時,您可以通過使用Barrier類的實例來同步這一類協同工作,通過屏障

下面貼代碼方便大家理解,如有問題,請指正,詳情見注釋:

    class PRogram    {        private static Task[] _CookTasks { get; set; }        private static Barrier _barrier { get; set; }        /*獲取當前計算機處理器數*/        private static int _particpants = Environment.ProcessorCount;        /*  coder:釋迦苦僧           *  代碼中 展示煮飯的步驟   1.打水  2.淘米 3.放入鍋中 4.蓋上鍋蓋 5.生火煮飯          */        static void Main(string[] args)        {            Console.WriteLine("定義{0}個人煮飯3次", _particpants);            _CookTasks = new Task[_particpants];            _barrier = new Barrier(_particpants, (barrier) =>            {                Console.WriteLine("當前階段:{0}", barrier.CurrentPhaseNumber);            });            Stopwatch swTask1 = new Stopwatch();            swTask1.Start();            /*定義N個人*/            for (int cook_person = 0; cook_person < _particpants; cook_person++)            {                _CookTasks[cook_person] = Task.Factory.StartNew((num) =>                {                    int index = Convert.ToInt32(num);                    /*每個人煮3次飯*/                    for (int cook_count = 0; cook_count < 3; cook_count++)                    {                        CookStepTask1(index, cook_count);                        CookStepTask2(index, cook_count);                        CookStepTask3(index, cook_count);                        CookStepTask4(index, cook_count);                        CookStepTask5(index, cook_count);                    }                }, cook_person);            }            /*ContinueWhenAll 提供一組任務完成后 延續方法*/            var finalTask = Task.Factory.ContinueWhenAll(_CookTasks, (tasks) =>            {                /*等待任務完成*/                Task.WaitAll(_CookTasks);                swTask1.Stop();                Console.WriteLine("采用并發 {1}個人煮3次飯耗時:{0}", swTask1.ElapsedMilliseconds, _particpants);                /*釋放資源*/                _barrier.Dispose();            });            Thread.Sleep(4000);            Stopwatch swTask = new Stopwatch();            swTask.Start();            /*定義N個人*/            for (int cook_person = 0; cook_person < _particpants; cook_person++)            {                /*每個人煮3次飯*/                for (int cook_count = 0; cook_count < 3; cook_count++)                {                    CookStep1(cook_person, cook_count); CookStep2(cook_person, cook_count); CookStep3(cook_person, cook_count); CookStep4(cook_person, cook_count); CookStep5(cook_person, cook_count);                }            }            swTask.Stop();            Console.WriteLine("不采用并發 {1}個人煮3次飯耗時:{0}", swTask.ElapsedMilliseconds, _particpants);            Thread.Sleep(2000);            Console.ReadLine();        }        /*1.打水*/        private static void CookStepTask1(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 打水... 耗時2分鐘", pesron_index, index);            Thread.Sleep(200);            /*存在線程暫停 所以需要將 _barrier.SignalAndWait();放在方法中 */            _barrier.SignalAndWait();        }        /*2.淘米*/        private static void CookStepTask2(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 淘米... 耗時3分鐘", pesron_index, index);            Thread.Sleep(300);            /*存在線程暫停 所以需要將 _barrier.SignalAndWait();放在方法中 */            _barrier.SignalAndWait();        }        /*3.放入鍋中*/        private static void CookStepTask3(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 放入鍋中... 耗時1分鐘", pesron_index, index);            Thread.Sleep(100);            /*存在線程暫停 所以需要將 _barrier.SignalAndWait();放在方法中 */            _barrier.SignalAndWait();        }        /*4.蓋上鍋蓋*/        private static void CookStepTask4(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 蓋上鍋蓋... 耗時1分鐘", pesron_index, index);            Thread.Sleep(100);            /*存在線程暫停 所以需要將 _barrier.SignalAndWait();放在方法中 */            _barrier.SignalAndWait();        }        /*5.生火煮飯*/        private static void CookStepTask5(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次  生火煮飯... 耗時30分鐘", pesron_index, index);            Thread.Sleep(500);            /*存在線程暫停 所以需要將 _barrier.SignalAndWait();放在方法中 */            _barrier.SignalAndWait();        }        /*1.打水*/        private static void CookStep1(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 打水... 耗時2分鐘", pesron_index, index);            Thread.Sleep(200);        }        /*2.淘米*/        private static void CookStep2(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 淘米... 耗時3分鐘", pesron_index, index);            Thread.Sleep(300);        }        /*3.放入鍋中*/        private static void CookStep3(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 放入鍋中... 耗時1分鐘", pesron_index, index);            Thread.Sleep(100);        }        /*4.蓋上鍋蓋*/        private static void CookStep4(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次 蓋上鍋蓋... 耗時1分鐘", pesron_index, index);            Thread.Sleep(100);        }        /*5.生火煮飯*/        private static void CookStep5(int pesron_index, int index)        {            Console.WriteLine("{0} 第{1}次  生火煮飯... 耗時30分鐘", pesron_index, index);            Thread.Sleep(500);        }    }    class Product    {        public string Name { get; set; }        public string Category { get; set; }        public int SellPrice { get; set; }    }
View Code

如代碼所示,在串行代碼中,雖然任務是有序進行,但是等待的時間很長,因為只是在一個處理器下進行處理,如下圖所示:

而采用并發處理中,使用Barrier,不僅保證了任務的有序進行,還在性能損耗上得到了最大程度的降低,如下圖

ContinueWhenAll 提供一組任務完成后的延續方法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩免费看| 成人精品视频在线| 成人做爽爽免费视频| www.欧美精品一二三区| 亚洲一区二区三区四区视频| 日本欧美爱爱爱| 亚洲欧美日韩久久久久久| 国产mv久久久| 91免费欧美精品| 中文字幕不卡av| 亚洲精品在线观看www| 久久综合五月天| 在线成人中文字幕| 九九热精品视频| 欧美在线视频免费观看| 欧美第一淫aaasss性| 中文字幕av一区二区| 久久久www成人免费精品张筱雨| 中文字幕亚洲字幕| 国产精品久久久久久久一区探花| 亚洲aaa激情| 亚洲一区二区三区在线免费观看| 久久久久久久激情视频| 98精品国产高清在线xxxx天堂| 日本三级久久久| 久久99国产综合精品女同| 福利精品视频在线| 亚洲国内高清视频| 91精品在线影院| 亚洲经典中文字幕| 在线视频日本亚洲性| 精品人伦一区二区三区蜜桃免费| 欧美另类暴力丝袜| 亚洲第一区在线| 欧美老女人bb| 欧美激情欧美激情在线五月| 国产精品中文字幕在线观看| 欧美在线亚洲在线| 日韩小视频在线观看| 久久久午夜视频| 51色欧美片视频在线观看| 久久久免费观看| 久久久久国产精品免费网站| 一个人www欧美| 2018中文字幕一区二区三区| 欧美激情在线有限公司| 岛国视频午夜一区免费在线观看| 17婷婷久久www| 精品精品国产国产自在线| 成人激情视频在线观看| 操日韩av在线电影| 亚洲精品456在线播放狼人| 亚洲影影院av| 欧美成人三级视频网站| 久久精品视频99| 日韩视频免费大全中文字幕| 5278欧美一区二区三区| 亚洲性夜色噜噜噜7777| 日韩电影视频免费| 久久久噜久噜久久综合| 欧美日本啪啪无遮挡网站| 狠狠躁18三区二区一区| 蜜月aⅴ免费一区二区三区| 国产精品爱久久久久久久| 国产精品9999| 欧美极品美女电影一区| 国产成人福利网站| 日韩美女激情视频| 亚洲最大av网站| 91精品国产自产在线观看永久| 日韩乱码在线视频| 国产精品亚洲综合天堂夜夜| 91香蕉嫩草影院入口| 国产精品高精视频免费| 亚洲最大福利网站| 国产精品国产福利国产秒拍| 国产精品日韩专区| 91精品视频播放| 亚洲一区亚洲二区| 成人精品一区二区三区电影免费| 精品久久久久久亚洲国产300| 一本色道久久综合狠狠躁篇怎么玩| 亚洲色图av在线| 97碰碰碰免费色视频| 亚洲男人的天堂在线播放| 亚洲欧美三级伦理| 欧美成人精品一区| 国产日本欧美一区二区三区在线| 日日噜噜噜夜夜爽亚洲精品| 亚洲va欧美va在线观看| 亚洲精品aⅴ中文字幕乱码| 国产精品第10页| 视频在线观看一区二区| 国产精品视频中文字幕91| 欧美精品免费播放| 4k岛国日韩精品**专区| 亚洲美女久久久| 欧美高清理论片| 国内自拍欧美激情| 欧美黄色片在线观看| 久久久精品视频成人| 国产精品福利网站| 精品久久久久久国产91| 国产在线精品一区免费香蕉| 4444欧美成人kkkk| 亚洲第一综合天堂另类专| 不卡av电影在线观看| 欧美激情亚洲精品| 亚洲图中文字幕| 亚洲精品免费av| 亚洲精品综合精品自拍| 国产97在线|日韩| 欧美日韩亚洲精品内裤| 中文字幕日本精品| 亚洲电影成人av99爱色| 久久视频在线免费观看| 国产精品高潮在线| 中文字幕亚洲色图| 久久久国产在线视频| 欧美激情一二三| 最近中文字幕mv在线一区二区三区四区| 国语自产在线不卡| 亚洲国产婷婷香蕉久久久久久| 91精品在线观| 亚洲欧美精品在线| 国产精品久久久久福利| 国产精品免费久久久久久| 色播久久人人爽人人爽人人片视av| 国模视频一区二区三区| 波霸ol色综合久久| 91av视频导航| 国产成人精品在线播放| 国产精品久久久久999| 国产精品扒开腿爽爽爽视频| 国产精品爱啪在线线免费观看| 精品无码久久久久久国产| 久久精品亚洲精品| 一区二区三区天堂av| 一区二区三区无码高清视频| 国产精品激情av电影在线观看| 欧美日韩亚洲精品内裤| 欧美激情视频一区二区| 国产精品日韩欧美大师| 中文字幕在线观看亚洲| 色哟哟网站入口亚洲精品| 久久av在线播放| 日韩精品极品视频免费观看| 91在线观看免费高清完整版在线观看| 日韩网站在线观看| 国产精品久久久久久av福利软件| 国产做受69高潮| 欧美一级淫片aaaaaaa视频| 欧美成年人视频| 96pao国产成视频永久免费| 国产精品免费看久久久香蕉| 精品日韩中文字幕| 国产精品亚洲аv天堂网| 亚洲第一精品夜夜躁人人躁| 中文字幕亚洲欧美日韩2019| 亚洲一区二区三区四区在线播放| 日韩av高清不卡| 亚洲人成网7777777国产| 正在播放欧美视频| 日韩av在线导航|