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

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

C#并行編程-并發集合

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

C#并行編程-并發集合

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

目錄

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

  • C#并行編程-Parallel

  • C#并行編程-Task

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

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

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

背景

基于任務的程序設計、命令式數據并行和任務并行都要求能夠支持并發更新的數組、列表和集合。

在.NET Framework 4 以前,為了讓共享的數組、列表和集合能夠被多個線程更新,需要添加復雜的代碼來同步這些更新操作。

如您需要編寫一個并行循環,這個循環以無序的方式向一個共享集合中添加元素,那么必須加入一個同步機制來保證這是一個線程安全的集合。

System.Collenctions和System.Collenctions.Generic 名稱空間中所提供的經典列表、集合和數組的線程都不是安全的,不能接受并發請求,因此需要對相應的操作方法執行串行化。

下面看代碼,代碼中并沒有實現線程安全和串行化:

    class PRogram    {        private static object o = new object();        private static List<Product> _Products { get; set; }        /*  coder:釋迦苦僧           *  代碼中 創建三個并發線程 來操作_Products 集合         *  System.Collections.Generic.List 這個列表在多個線程訪問下,不能保證是安全的線程,所以不能接受并發的請求,我們必須對ADD方法的執行進行串行化         */        static void Main(string[] args)        {            _Products = new List<Product>();            /*創建任務 t1  t1 執行 數據集合添加操作*/            Task t1 = Task.Factory.StartNew(() =>            {                AddProducts();            });            /*創建任務 t2  t2 執行 數據集合添加操作*/            Task t2 = Task.Factory.StartNew(() =>            {                AddProducts();            });            /*創建任務 t3  t3 執行 數據集合添加操作*/            Task t3 = Task.Factory.StartNew(() =>            {                AddProducts();            });            Task.WaitAll(t1, t2, t3);            Console.WriteLine(_Products.Count);            Console.ReadLine();        }        /*執行集合數據添加操作*/        static void AddProducts()        {            Parallel.For(0, 1000, (i) =>            {                Product product = new Product();                product.Name = "name" + i;                product.Category = "Category" + i;                product.SellPrice = i;                _Products.Add(product);            });        }    }    class Product    {        public string Name { get; set; }        public string Category { get; set; }        public int SellPrice { get; set; }    }
View Code

代碼中開啟了三個并發操作,每個操作都向集合中添加1000條數據,在沒有保障線程安全和串行化的運行下,實際得到的數據并沒有3000條,結果如下:

為此我們需要采用Lock關鍵字,來確保每次只有一個線程來訪問 _Products.Add(product); 這個方法,代碼如下:

    class Program    {        private static object o = new object();        private static List<Product> _Products { get; set; }        /*  coder:釋迦苦僧           *  代碼中 創建三個并發線程 來操作_Products 集合         *  System.Collections.Generic.List 這個列表在多個線程訪問下,不能保證是安全的線程,所以不能接受并發的請求,我們必須對ADD方法的執行進行串行化         */        static void Main(string[] args)        {            _Products = new List<Product>();            /*創建任務 t1  t1 執行 數據集合添加操作*/            Task t1 = Task.Factory.StartNew(() =>            {                AddProducts();            });            /*創建任務 t2  t2 執行 數據集合添加操作*/            Task t2 = Task.Factory.StartNew(() =>            {                AddProducts();            });            /*創建任務 t3  t3 執行 數據集合添加操作*/            Task t3 = Task.Factory.StartNew(() =>            {                AddProducts();            });            Task.WaitAll(t1, t2, t3);            Console.WriteLine("當前數據量為:" + _Products.Count);            Console.ReadLine();        }        /*執行集合數據添加操作*/        static void AddProducts()        {            Parallel.For(0, 1000, (i) =>            {                Product product = new Product();                product.Name = "name" + i;                product.Category = "Category" + i;                product.SellPrice = i;                lock (o)                {                    _Products.Add(product);                }            });        }    }    class Product    {        public string Name { get; set; }        public string Category { get; set; }        public int SellPrice { get; set; }    }
View Code

但是鎖的引入,帶來了一定的開銷和性能的損耗,并降低了程序的擴展性,在并發編程中顯然不適用。

System.Collections.Concurrent

.NET Framework 4提供了新的線程安全和擴展的并發集合,它們能夠解決潛在的死鎖問題和競爭條件問題,因此在很多復雜的情形下它們能夠使得并行代碼更容易編寫,這些集合盡可能減少需要使用鎖的次數,從而使得在大部分情形下能夠優化為最佳性能,不會產生不必要的同步開銷。

需要注意的是:

線程安全并不是沒有代價的,比起System.Collenctions和System.Collenctions.Generic命名空間中的列表、集合和數組來說,并發集合會有更大的開銷。因此,應該只在需要從多個任務中并發訪問集合的時候才使用并發幾個,在串行代碼中使用并發集合是沒有意義的,因為它們會增加無謂的開銷。

為此,在.NET Framework中提供了System.Collections.Concurrent新的命名空間可以訪問用于解決線程安全問題,通過這個命名空間能訪問以下為并發做好了準備的集合。

1.BlockingCollection 與經典的阻塞隊列數據結構類似,能夠適用于多個任務添加和刪除數據,提供阻塞和限界能力。

2.ConcurrentBag 提供對象的線程安全的無序集合

3.ConcurrentDictionary 提供可有多個線程同時訪問的鍵值對的線程安全集合

4.ConcurrentQueue 提供線程安全的先進先出集合

5.ConcurrentStack 提供線程安全的后進先出集合

這些集合通過使用比較并交換和內存屏障等技術,避免使用典型的互斥重量級的鎖,從而保證線程安全和性能。

ConcurrentQueue

ConcurrentQueue是完全無鎖的,能夠支持并發的添加元素,先進先出。下面貼代碼,詳解見注釋:

    class Program    {        private static object o = new object();        /*定義 Queue*/        private static Queue<Product> _Products { get; set; }        private static ConcurrentQueue<Product> _ConcurrenProducts { get; set; }        /*  coder:釋迦苦僧           *  代碼中 創建三個并發線程 來操作_Products 和 _ConcurrenProducts 集合,每次添加 10000 條數據 查看 一般隊列Queue 和 多線程安全下的隊列ConcurrentQueue 執行情況         */        static void Main(string[] args)        {            Thread.Sleep(1000);            _Products = new Queue<Product>();            Stopwatch swTask = new Stopwatch();            swTask.Start();            /*創建任務 t1  t1 執行 數據集合添加操作*/            Task t1 = Task.Factory.StartNew(() =>            {                AddProducts();            });            /*創建任務 t2  t2 執行 數據集合添加操作*/            Task t2 = Task.Factory.StartNew(() =>            {                AddProducts();            });            /*創建任務 t3  t3 執行 數據集合添加操作*/            Task t3 = Task.Factory.StartNew(() =>            {                AddProducts();            });            Task.WaitAll(t1, t2, t3);            swTask.Stop();            Console.WriteLine("List<Product> 當前數據量為:" + _Products.Count);            Console.WriteLine("List<Product> 執行時間為:" + swTask.ElapsedMilliseconds);            Thread.Sleep(1000);            _ConcurrenProducts = new ConcurrentQueue<Product>();            Stopwatch swTask1 = new Stopwatch();            swTask1.Start();            /*創建任務 tk1  tk1 執行 數據集合添加操作*/            Task tk1 = Task.Factory.StartNew(() =>            {                AddConcurrenProducts();            });            /*創建任務 tk2  tk2 執行 數據集合添加操作*/            Task tk2 = Task.Factory.StartNew(() =>            {                AddConcurrenProducts();            });            /*創建任務 tk3  tk3 執行 數據集合添加操作*/            Task
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产色综合| 91啪国产在线| 日韩一区二区久久久| 欧美激情一区二区三区在线视频观看| 一个人看的www欧美| 国产精品第8页| 欧美一区二区色| 国产精品 欧美在线| 欧美性资源免费| 欧美大片欧美激情性色a∨久久| 97国产suv精品一区二区62| 国产亚洲精品成人av久久ww| 国产精品偷伦视频免费观看国产| 米奇精品一区二区三区在线观看| 久久夜色精品亚洲噜噜国产mv| 国产精品一区二区三区免费视频| 97视频在线播放| 久久久免费观看| 欧美激情一级欧美精品| 久久99久国产精品黄毛片入口| 亚洲福利影片在线| 国产精品免费久久久久久| 欧美日韩国产页| 韩曰欧美视频免费观看| 欧美专区在线播放| 欧美国产日韩一区二区三区| 欧美人与物videos| 一个人看的www久久| 亚洲第一av网| 国产精品色悠悠| 日韩国产精品视频| 欧美成人网在线| 久久亚洲精品小早川怜子66| 国产suv精品一区二区| 亚洲欧美成人精品| 午夜美女久久久久爽久久| 黑人巨大精品欧美一区二区| 69视频在线播放| 国产免费一区视频观看免费| 亚洲欧美日韩直播| 欧美一区二区影院| 国产精品高潮呻吟久久av黑人| 九九精品在线播放| 亚洲天堂男人天堂| 欧美日韩福利在线观看| 亚洲美女激情视频| 国产欧美一区二区三区在线看| 欧美在线观看网址综合| 欧美午夜精品在线| 久久久久这里只有精品| 精品日本美女福利在线观看| 国产日韩av高清| 亚洲美女av在线| 亚洲白拍色综合图区| 欧美华人在线视频| 日韩免费av片在线观看| 97成人精品视频在线观看| 国产精品久久久91| 日韩在线免费视频| 亚洲天堂久久av| 亚洲激情免费观看| 亚洲国产欧美一区二区三区久久| 中文字幕亚洲一区二区三区| 亚洲精品国产拍免费91在线| 亚洲人精选亚洲人成在线| 91国产精品电影| 91视频国产精品| 在线看片第一页欧美| 在线日韩精品视频| 欧美国产精品va在线观看| 国产精品久久久久久久一区探花| 久久人人爽人人爽爽久久| 性金发美女69hd大尺寸| 中文字幕亚洲情99在线| 久久久国产视频| 日韩激情av在线免费观看| 91国产一区在线| …久久精品99久久香蕉国产| 久久国产精品久久久久久| 色一情一乱一区二区| 日韩av电影院| 久久综合五月天| 久久乐国产精品| 日韩免费观看在线观看| 亚洲国模精品一区| 亚洲午夜精品久久久久久性色| 亚洲久久久久久久久久久| 欧美性猛交xxxxx水多| 国产精品无码专区在线观看| 免费91麻豆精品国产自产在线观看| 欧美性生交xxxxx久久久| …久久精品99久久香蕉国产| 欧美一级在线亚洲天堂| 国产精品九九久久久久久久| 日韩av毛片网| 亚洲免费视频一区二区| 亚洲xxxx做受欧美| 国产精品情侣自拍| 久久久久久中文| 精品国产一区二区三区四区在线观看| 美女性感视频久久久| 在线日韩日本国产亚洲| 91免费国产视频| 亚洲aaa激情| 中文字幕亚洲欧美| 最新亚洲国产精品| 一本色道久久综合亚洲精品小说| 欧美一区二区大胆人体摄影专业网站| 日韩精品视频在线观看免费| 欧美成人中文字幕在线| 久久久久亚洲精品成人网小说| xvideos成人免费中文版| 国产精品扒开腿做爽爽爽男男| 亚洲欧美中文日韩在线v日本| 国产亚洲视频在线| 91在线观看免费高清| 欧美日韩xxxxx| 久久精视频免费在线久久完整在线看| 日本精品一区二区三区在线播放视频| 国内精品久久久久久久久| **欧美日韩vr在线| 国产精品va在线播放我和闺蜜| 成人在线激情视频| 久久琪琪电影院| 久久久免费精品| 亚洲成人黄色在线| **欧美日韩vr在线| 欧美一级片在线播放| 欧美日韩视频在线| 欧美激情国产日韩精品一区18| 亚洲sss综合天堂久久| 欧美美女18p| 亚洲欧美日韩一区在线| 一区二区三区视频观看| 4388成人网| 国产亚洲欧美视频| 久久久久久亚洲精品不卡| 欧美在线一区二区视频| 日韩中文字幕免费看| 亚洲精品v欧美精品v日韩精品| 原创国产精品91| 亚洲欧美另类国产| 亚洲精品国产欧美| 黑人巨大精品欧美一区二区一视频| 亚洲毛片一区二区| 日本不卡免费高清视频| 日韩高清av一区二区三区| 欧美激情一区二区久久久| 国产综合在线视频| 国产亚洲精品一区二区| 欧美一区三区三区高中清蜜桃| 亚洲人a成www在线影院| 欧美中文在线免费| 精品国产乱码久久久久久婷婷| 成人亚洲激情网| 色与欲影视天天看综合网| 精品少妇一区二区30p| 国产精品电影一区| 久久免费福利视频| 亚洲人成在线观看网站高清| 久久99精品久久久久久噜噜| 亚洲成人网久久久| 亚洲电影在线观看| 1769国内精品视频在线播放|