国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

.NET 4并行編程之共享數據問題和解決概述

開發 后端
本文介紹的是.NET 4并行編程中應該會遇到的一些問題,包括共享數據之間的競爭,以及數據不變的解決方案。

之前的文章介紹了了并行編程的一些基礎的知識,從本篇開始,將會講述并行編程中實際遇到一些問題,接下來的幾篇將會講述數據共享問題。

[[12166]]498)this.style.width=498;">

本篇的議題如下:      

1.數據競爭

2.解決方案提出

3.順序的執行解決方案

4.數據不變解決方案

在開始之前,首先,我們來看一個很有趣的例子:

  1. class BankAccount  
  2. {  
  3.     public int Balance  
  4.     {  
  5.         get;  
  6.         set;  
  7.     }  
  8. }  
  9. class App  
  10. {  
  11.     static void Main(string[] args)  
  12.     {  
  13.         // create the bank account instance  
  14.         BankAccount account = new BankAccount();  
  15.         // create an array of tasks  
  16.         Task[] tasks = new Task[10];  
  17.         for (int i = 0; i < 10; i++)  
  18.         {  
  19.             // create a new task  
  20.             tasks[i] = new Task(() =>  
  21.             {  
  22.                 // enter a loop for 1000 balance updates  
  23.                 for (int j = 0; j < 1000; j++)  
  24.                 {  
  25.                     // update the balance  
  26.                     account.Balance = account.Balance + 1;  
  27.                 }  
  28.             });  
  29.             // start the new task  
  30.             tasks[i].Start();  
  31.         }  
  32.  
  33.         // wait for all of the tasks to complete  
  34.         Task.WaitAll(tasks);  
  35.  
  36.         // write out the counter value  
  37.         Console.WriteLine("Expected value {0}, Counter value: {1}",  
  38.         10000, account.Balance);  
  39.  
  40.         // wait for input before exiting  
  41.         Console.WriteLine("Press enter to finish");  
  42.         Console.ReadLine();  
  43.     }  

10個task,每個task都是把BankAccount.Balance自增1000次。之后代碼就等到10個task執行完畢,然后打印出Balance的值。大家猜想一下,上次的代碼執行完成之后,打印出來的Balance的結果是多少?

J結果確實和大家猜想的一樣:結果不等于10000。每次執行一次上面的代碼,都會得到不同的結果,而且這些結果值都在10000左右,如果運氣好,可能看到有那么一兩次結果為10000.為什么會這樣?

下面就是本篇和接下來的幾篇文章要講述的內容。

1.數據競爭

如果大家對多線程編程比較熟悉,就知道上面情況的產生是因為 “共享數據競爭”導致的(對多線程不熟悉不清楚的朋友也不用擔心)。當有兩個或者更多的task在運行并且操作同一個共享公共數據的時候,就存在潛在的競爭。如果不合理的處理競爭問題,就會出現上面意想不到的情況。

下面就來分析一下:上面代碼的情況是怎么產生的。

當在把account對象的Balance進行自增的時候,一般執行下面的三個步驟:

  1. 讀取現在account對象的Balance屬性的值。
  2. 計算,創建一個臨時的新變量,并且把Balance屬性的值賦值給新的變量,而且把新變量的值增加1
  3. 把新變量的值再次賦給account的Balance屬性

在理論上面,上面的三個步驟是代碼的執行步驟,但是實際中,由于編譯器,.NET 運行時對自增操作的優化操作,和操作系統等的因素,在執行上面代碼的時候,并不一定是按照我們設想的那樣運行的,但是為了分析的方便,我們還是假設代碼是按照上面的三個步驟運行的。

之前的代碼每次執行一次,執行代碼的計算機就每次處于不同的狀態:CPU的忙碌狀況不同,內存的剩余多少不同,等等,所以每次代碼的運行,計算機不可能處于完全一樣的環境中。

在下面的圖中,顯示了兩個task之間是如何發生競爭的。當兩個task啟動了之后(雖然說是并行運算,但是不管這樣,兩個的task的執行時間不可能完全一樣,也就是說,不可能恰好就是同時開始執行的,起碼在開始執行的時間上是有一點點的差異的)。

架構差異

1.    首先Task1讀取到當前的balance的值為0。

2.    然后,task2運行了,并且也讀取到當前的balance值為0。

3.    兩個task都把balance的值加1

4.    Task1把balance的值加1后,把新的值保存到了balance中

5.    Task2 也把新的保存到了balance中

所以,結果就是:雖然兩個task 都為balance加1,但是balance的值還是1。

通過這個例子,相信大家應該清楚,為什么上面的10個task執行1000,而執行后的結果不是10000了。 

2.  解決方案提出

數據競爭就好比一個生日party。其中,每一個task都是參加party的人,當生日蛋糕出來之后,每個人都興奮了。如果此時,所有的人都一起沖過去拿屬于他們自己的那塊蛋糕,此時party就一團糟了,沒有如何順序。

在之前的圖示例講解中,balance那個屬性就好比蛋糕,因為task1,task2都要得到它,然后進行運算。當我們來讓多個task共享一個數據時就可能出現問題。下面列出了四種解決方案:

1.    順序執行:也就是讓第一個task執行完成之后,再執行第二個。

2.    數據不變:我們讓task不能修改數據。

3.    隔離:我們不共享數據,讓每個task都有一份自己的數據拷貝。

4.    同步:通過調整task的執行,有序的執行task。

注意:同步和以前多線程中的同步,或者數據庫操作時的同步概念不一樣

3.順序的執行的解決方案

順序的執行解決了通過每次只有一個task訪問共享數據的方式解決了數據競爭的問題,其實在本質上,這種解決方案又回到了之前的單線程編程模型。如果拿之前的party分蛋糕的例子,那么現在就是一次只能允許一個人去拿蛋糕。

4.數據不變解決方案

數據不變的解決方案就是通過讓數據不能被修改的方式來解決共享數據競爭。如果拿之前的蛋糕為例子,那么此時的情況就是:現在蛋糕只能看,不能吃。

在C#中,可以同關鍵字 readonly 和 const來聲明一個字段不能被修改:

public const int AccountNumber=123456;

被聲明為const的字段只能通過類型來訪問:如,上面的AccountNumber是在Blank類中聲明的,那么訪問的方式就是Blank. AccountNumber

readonly的字段可以在實例的構造函數中修改。

如下代碼:

  1. using System;  
  2.  
  3. class ImmutableBankAccount  
  4. {  
  5.     public const int AccountNumber = 123456;  
  6.     public readonly int Balance;  
  7.     public ImmutableBankAccount(int InitialBalance)  
  8.     {  
  9.         Balance = InitialBalance;  
  10.     }  
  11.     public ImmutableBankAccount()  
  12.     {  
  13.         Balance = 0;  
  14.     }  
  15. }  
  16.  
  17. class App  
  18. {  
  19.     static void Main(string[] args)  
  20.     {  
  21.         // create a bank account with the default balance  
  22.         ImmutableBankAccount bankAccount1 = new ImmutableBankAccount();  
  23.         Console.WriteLine("Account Number: {0}, Account Balance: {1}",  
  24.  
  25.         ImmutableBankAccount.AccountNumber, bankAccount1.Balance);  
  26.  
  27.         // create a bank account with a starting balance  
  28.         ImmutableBankAccount bankAccount2 = new ImmutableBankAccount(200);  
  29.         Console.WriteLine("Account Number: {0}, Account Balance: {1}",  
  30.         ImmutableBankAccount.AccountNumber, bankAccount2.Balance);  
  31.  
  32.         // wait for input before exiting  
  33.         Console.WriteLine("Press enter to finish");  
  34.         Console.ReadLine();  
  35.     }  

數據不變的解決方案不是很常用,因為它對數據限制太大了。

原文標題:.NET 并行(多核)編程系列之七 共享數據問題和解決概述 

鏈接:http://www.cnblogs.com/yanyangtian/archive/2010/06/24/1764098.html

【編輯推薦】

  1. 微軟發布新版Windows 7及.NET 4軟件開發工具包
  2. 詳解.NET 4.0并行計算支持歷史
  3. 詳讀.NET 4.0環境配置
  4. 詳解.NET 4.0中異常處理方面的新特性
  5. 三方面詮釋.NET 4.0的新特性
責任編輯:彭凡 來源: 博客園
相關推薦

2010-06-11 09:01:02

.NET 4并行編程

2010-06-02 08:53:51

.NET 4并行編程

2010-06-04 09:11:10

.NET并行編程

2010-06-08 08:41:08

.NET 4并行編程

2010-06-07 08:43:46

.NET 4并行編程

2021-03-05 07:38:52

C++線程編程開發技術

2009-07-22 17:45:35

ASP.NET教程

2010-06-09 09:18:34

.NET 4并行編程

2020-05-09 22:54:48

物聯網安全物聯網IOT

2009-06-29 09:38:50

JSF標簽JSF

2011-06-22 10:20:11

QT 鼠標 拖放

2020-03-11 09:57:10

數據安全網絡安全網絡攻擊

2015-10-13 09:18:00

.Net編程教程

2011-03-31 16:45:39

Redhat配置nagios

2013-07-30 14:00:46

.NET數據類型

2012-03-09 10:44:11

Java

2018-03-09 16:27:50

數據庫Oracle同步問題

2022-03-31 10:25:20

物聯網工業 4.0大數據分析

2024-10-10 15:32:51

2023-10-16 16:08:42

工業 4.0物聯網邊緣計算
點贊
收藏

51CTO技術棧公眾號

国产玉足脚交久久欧美| 久久久免费精品| 九色porny丨首页在线| 国产拍精品一二三| 欧美极品美女电影一区| 在线视频一区二区三区| 欧美久久久久| 在线成人视屏| 91传媒在线观看| 国产精品精品一区二区三区午夜版 | 香蕉成人啪国产精品视频综合网| av一区二区久久| 91精品国产91久久久久久黑人| 777久久精品| 国产精品99久久免费黑人人妻| 日韩在线视频一区| 中文字幕的久久| 欧美一区二区三区激情视频| 欧美日韩在线中文| 欧美专区福利在线| 欧美日韩国产在线观看| 久久狠狠亚洲综合| 日韩一区二区三免费高清在线观看| 欧美一区二区综合| 国产精品视频专区| 亚洲第一视频在线观看| 亚洲欧洲综合另类在线| 蜜桃一区二区三区| 国产激情精品一区二区三区| 高潮一区二区| 视频在线91| 一区一区视频| 北条麻妃久久精品| 亚洲国产精品成人综合| 国产欧美精品一区| 日韩午夜av在线| 成年人黄色大片在线| 警花观音坐莲激情销魂小说| 精品视频9999| 亚洲已满18点击进入久久| 中文在线一区| 欧美日韩精品免费观看视频完整| 黄色免费在线播放| 日韩三级在线播放| 久久精品一区中文字幕| 久久久另类综合| 国产精品18hdxxxⅹ在线| 精品无人乱码| 男女裸体影院高潮| 欧美孕妇与黑人孕交| 欧美色欧美亚洲另类二区| 黑人巨大精品欧美黑白配亚洲| 免费观看在线一区二区三区| 久久一区免费| 久久久久五月天| 日韩片之四级片| 成人av免费在线观看| 欧美日韩电影免费看| av中文字幕电影在线看| 97高清视频| 日韩欧美一区二| 欧美大学生性色视频| 专区另类欧美日韩| 在线视频观看日韩| 亚洲97av| 麻豆精品久久| 久操视频在线观看| 在线观看国产高清视频| 国产裸体免费无遮挡| 91麻豆国产语对白在线观看| 欧美日韩免费一区二区三区视频| 国风产精品一区二区| 日韩一区二区三区在线免费观看 | 国产精品一区专区| 97av中文字幕| 久久网福利资源网站| 99在线热播精品免费99热| 免费在线毛片网站| 欧美性www| 国产毛片一区二区三区| 91成人国产| 丝袜国产日韩另类美女| 懂色一区二区三区免费观看| 日本亚洲天堂网| 亚洲手机在线| 黄页网站在线| 亚洲电影观看| 99精品视频网| 欧美一级搡bbbb搡bbbb| 老司机午夜精品视频在线观看| 国产在线观看黄| 久久综合九九| eeuss一区二区三区| 日韩欧美a级成人黄色| 黄色网址在线播放| 精品不卡在线| 欧美午夜精品理论片a级大开眼界| 欧美一级高清免费| 亚洲福利影片在线| 亚洲欧美中文另类| 中文字幕精品视频| 九九久久综合网站| 天堂在线看视频| 久久精品视频在线播放| 欧美日韩一区二区在线播放| 一区二区在线观看免费| 成人app下载| 国产精品污网站| 91精品啪在线观看国产60岁| 久久九九免费视频| 成人国产精品一区| 无码熟妇人妻av在线电影| 中文在线有码| 成人直播在线| 精品久久毛片| 色琪琪久久se色| 美女视频一区二区| 亚洲欧美日韩国产成人精品影院| 在线播放欧美女士性生活| 成人av在线天堂| 性色av一区| 激情久久99| 久久天堂成人| 中文字幕av在线一区二区三区| 欧美成人性福生活免费看| 欧洲亚洲女同hd| 欧美视频在线观看网站| 97电影在线看视频| 日本女人一区二区三区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久久久北条麻妃免费看| 欧美日韩美女在线| 久久福利电影| 日韩中文字幕亚洲精品欧美| 91九色在线观看视频| 国产精品区一区二区三在线播放| 亚洲一区二区三区四区在线播放 | 国产一区二区三区国产| 日韩伦理一区二区三区| 国产精品午夜av在线| 任我爽在线视频精品一| 久久99九九| 亚洲aaaaaa| 欧美日韩一区高清| 国产精品美女网站| 欧美精选视频在线观看| 国产精品福利一区| 亚洲午夜在线观看视频在线| 久久精品日韩精品| 欧美香蕉爽爽人人爽| 国产乱码字幕精品高清av | 日韩欧美国产一区在线观看| 欧美国产日韩a欧美在线观看| 国语自产精品视频在线看抢先版结局| 久久久久一区| 久久久精品天堂| 欧美α欧美αv大片| 成人精品久久av网站| 欧美日本网站| 欧美午夜久久| 欧美色综合网站| 日本在线观看一区二区三区| www.成人在线.com| 亚洲精品一区二区三区99| 欧美一级视频免费看| 日韩av黄色| 国产精品三级av在线播放| 成人免费91在线看| 97成人资源| 亚洲国产综合色| 欧美 日韩精品| 黄色欧美视频| 午夜精品久久久久久久久久| 国产富婆一区二区三区| 国产经典三级在线| 国产剧情一区二区| 清纯唯美亚洲激情| 成人午夜sm精品久久久久久久| 欧洲在线/亚洲| 国产网红在线| 日本不卡的三区四区五区| 欧美黑人xxxⅹ高潮交| 久草视频在线看| 久久―日本道色综合久久| 91视频免费版污| 香蕉成人久久| 欧美成人中文字幕在线| 97超碰国产一区二区三区| 国产精品污www在线观看| 亚洲国产欧洲综合997久久| 日韩视频精品在线观看| 欧美日韩国产123| 日本激情在线观看| 一区二区三区欧美亚洲| 警花观音坐莲激情销魂小说| 欧美精品成人| 91理论片午午论夜理片久久| 视频一区二区在线播放| 91理论电影在线观看| 欧美日韩国产一二|