成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從公交塞車看C#多線程同步問題

開發(fā)
什么是線程同步? 多個線程同時運行時,可能會因為線程之間的邏輯關(guān)系而決定誰先執(zhí)行,誰后執(zhí)行, 這就是線程同步。

好久沒寫博客了,可能是因為最近工作太過于壓抑的原因吧!有點頹廢了.... 而且公司距離住處要坐公交將近40--50分鐘(各個原因,糾結(jié)中ing...),提前一個半小時起床,居然還能遲到!因為距離公司前兩站是個十字路口,每天能在哪里塞上30多分鐘....眼看就要到公司了,一輛接一輛阻塞著..看著時間一分一秒的過去..心里不盡拔涼起來(遲到會扣錢的!)... 拔涼之余不禁讓我想到C#中線程的同步異步.所以呈此博文,來談?wù)勎覍#中線程同步的理解,不當(dāng)之處,請大家多多指點,在此先謝謝了!

什么是線程同步? 多個線程同時運行時,可能會因為線程之間的邏輯關(guān)系而決定誰先執(zhí)行,誰后執(zhí)行, 這就是線程同步。

(1)線程的優(yōu)先級

當(dāng)線程之間爭奪CPU時間片時,CPU是按照線程的優(yōu)先級進(jìn)行服務(wù)的。在C#應(yīng)用程序中,線程有5個不同的優(yōu)先級,由高到低分別是:Highest、AboveNormal、Normal 、BelowNormal和Lowest。創(chuàng)建線程時,如果不指定其優(yōu)先級,則系統(tǒng)默認(rèn)為Normal。

如:

Thread t = new Thread(MethodName);

t.priority = ThreadPriority.AboveNormal;

通過設(shè)置線程的優(yōu)先級可以改變線程執(zhí)行的順序,所設(shè)置的優(yōu)先級僅僅適用于這些線程所屬的進(jìn)程。(注:當(dāng)把某個線程的優(yōu)先級設(shè)置為Htghest時,系統(tǒng)上正在運行的其他線程都會終止,所以使用這個優(yōu)先級的時候要特別小心。除非遇到“幣需”馬上處理的任務(wù),否則不要使用這個優(yōu)先級)。

(2)線程同步

多線程處理解決了吞吐量和響應(yīng)速度的問題,但同時也帶來了資源共享問題,如死鎖和資源爭用。多線程特別適用于需要不同的資源(如文件句柄和網(wǎng)絡(luò)連接)的任務(wù)。為單個資源分配多個線程可能會導(dǎo)致同步問題,這種情況下,線程可能會北頻繁阻止以等待其他線程,從而使用多線程的初衷背道而馳。

所謂同步,是指多個線程之間存在先后執(zhí)行順序的關(guān)聯(lián)關(guān)系。如果一個線程必須在另一個線程完成某個工作后才能繼續(xù)執(zhí)行,則必須考慮如何讓其他保持同步,以確保在系統(tǒng)上同時運行多個線程而不會出現(xiàn)死鎖或邏輯錯誤。

為了解決同步問題,一般使用輔助線程執(zhí)行不需要大量占用其他線程所使用的資源的耗時任務(wù)或時間要求緊迫的任務(wù)。但實際上,程序中的某些資源必須由多個線程訪問。為了解決這些問題,System.Threading命名空間提供了多個用于同步線程的類。這些類包括Mutex,Monitor,Interlocked,AutoResetEvent. 但是實際應(yīng)用程序中,我們使用最多的可能不是這些類,而是C#提供的lock語句。

Lock語句

為了在多線程應(yīng)用程序中讓同步變得簡單,C#專門提供了一個lock語句。lock關(guān)鍵字能確保當(dāng)一個線程位于代碼的臨界區(qū)時,另一個線程不進(jìn)入臨界區(qū)。如果其他線程試圖進(jìn)入鎖定的代碼段,則它將一直等待(阻塞),知道鎖定的對象被釋放以后才能進(jìn)入臨界區(qū)。

  1. private Object obj = new Object();  
  2. .....  
  3. lock(obj)  
  4. {  
  5.      //臨界區(qū)  

舉個例子相信大家會更明白,路人甲和路人乙要上廁所,剛好找到了一個公共廁所,杯具的是公共廁所里面只有一個位置,路人甲是會員(優(yōu)先級高),先溜進(jìn)去了,然后把門鎖上(Lock)緊接著里面發(fā)出一陣陣巨響....(大家都懂的,最近食物不敢亂吃啊 - -!)。路人乙可著急了,捂著肚子,在外面打轉(zhuǎn),憋得面紅耳赤!過了好一段時間,路人甲抽著香煙,吹著口哨,從廁所里面走出來(Lock解鎖了),路人乙急忙鉆進(jìn)去,緊接著又是一陣巨響.....

雖然這個例子舉的有點不和諧,但相信大家已經(jīng)弄明白Lock的作用了。

值得注意的是:1、鎖定的對象名(上面的obj),一般聲明為Object類型,注意不要將其聲明為值類型,對象名叫什么無所謂,只要符合對象命名原則就行。2、一定要將該Object類型的對象名聲明為private(私有),不能將其聲明為public(公共),否則將會使lock語句無法控制,從而引發(fā)一系列的問題。 (就像上面舉例一樣:漆黑不見五指的夜晚(沒電),路人乙解開褲帶,正準(zhǔn)備蹲下時,一只手把路人乙的PP托住,喊道:有人!- -#。)3、處于臨界區(qū)的代碼不宜太多。如果在鎖定和解鎖期間處理的代碼過多,由于某個線程執(zhí)行臨界區(qū)中的代碼時,其他等待運行臨界區(qū)中代碼的線程都會處于阻塞狀態(tài),這樣就可能會降低應(yīng)用程序的性能。(路人乙會恨死路人甲的!)

好了,閑話就說這么多,還是拿代碼說事吧,說過隨機取款的例子。

(1)新建一個名為LockExample的Windows應(yīng)用程序,放下一個listbox,一個button,界面如下:

 

 

(2)添加一個類:Account.cs。代碼如下:

  1. class Account  
  2.     {  
  3.         private Object obj = new object();  
  4.         int balance;  
  5.         Random rd = new Random();  
  6.         Form1 form1;  
  7.  
  8.         public Account(int initial,Form1 form1)  
  9.         {  
  10.             this.form1 = form1;  
  11.             this.balance = initial;  
  12.         }  
  13.  
  14.         /// <summary>  
  15.         /// Withdraws the specified amount.  
  16.         /// </summary>  
  17.         /// <param name="amount">The amount.</param>  
  18.         /// <returns></returns>  
  19.         private int Withdraw(int amount)  
  20.         {  
  21.             if (balance < 0)  
  22.             {  
  23.                 form1.AddListBoxItem("余額" + balance + " 兄弟,你以為你這是信用卡啊!還錢吧!");  
  24.             }  
  25.  
  26.             //將lock(lockedobj)這句話注視掉,看看會發(fā)生什么情況  
  27.             lock (obj)  
  28.             {  
  29.                 if (balance >= amount)  
  30.                 {  
  31.                     string str = Thread.CurrentThread.Name + "取款---";  
  32.                     str += string.Format("取款前余額:{0,-6}取款:{1,-6}",balance,amount);  
  33.                     balance = balance - amount;  
  34.                     str += "取款前余額:" + balance;  
  35.                     form1.AddListBoxItem(str);  
  36.                     return amount;  
  37.                 }  
  38.                 else 
  39.                 {  
  40.                     return 0;  
  41.                 }  
  42.             }  
  43.         }  
  44.  
  45.         public void DoTransactions()  
  46.         {  
  47.             for (int i = 0; i < 100; i++)  
  48.             {  
  49.                 Withdraw(rd.Next(1,100));  
  50.             }  
  51.         }  
  52.     } 

(3)切換到Form1.cs代碼編輯界面,寫入一下代碼:

  1. public partial class Form1 : Form  
  2.     {  
  3.         public Form1()  
  4.         {  
  5.             InitializeComponent();  
  6.         }  
  7.  
  8.         private void btnLock_Click(object sender, EventArgs e)  
  9.         {  
  10.             lbLock.Items.Clear();  
  11.             Thread[] threads = new Thread[10];  
  12.             Account acc = new Account(1000,this);  
  13.             for (int i = 0; i < 10; i++)  
  14.             {  
  15.                 Thread t = new Thread(acc.DoTransactions);  
  16.                 t.Name = "線程" + i;  
  17.                 threads[i] = t;  
  18.             }  
  19.  
  20.             for (int i = 0; i < 10; i++)  
  21.             {  
  22.                 threads[i].Start();  
  23.             }  
  24.         }  
  25.  
  26.         delegate void AddListBoxItemDelegate(string str);  
  27.         public void AddListBoxItem(string str)  
  28.         {  
  29.             if (lbLock.InvokeRequired)  
  30.             {  
  31.                 AddListBoxItemDelegate d = AddListBoxItem;  
  32.                 lbLock.Invoke(d, str);  
  33.             }  
  34.             else 
  35.             {  
  36.                 lbLock.Items.Add(str);  
  37.             }  
  38.         }  
  39.     } 

(4)按<F5>編譯并運行,單擊 “開始自動隨機取款”按鈕,觀察線程執(zhí)行后在listbox中添加的可能出現(xiàn)的內(nèi)容,如圖:

 

 

(5) 將lock(obj)這條語句注視掉,再次運行程序,觀察線程執(zhí)行后在listbox中添加的可能出現(xiàn)的內(nèi)容,如圖:

 

 

如圖中線程6取款后余額已經(jīng)是584了,但是在線程7取款時候 余額又變成了746.顯然結(jié)果不正確。

好了,對線程同步問題和解決同步問題的理解,就先寫道這里,上述不當(dāng)之處,希望大家多多指點,共同進(jìn)步。

原文:http://www.cnblogs.com/axing/archive/2011/08/25/lock.html

【編輯推薦】

  1. C#數(shù)組排序與對象大小比較
  2. 把C#.NET程序移植到DB2上的經(jīng)驗淺談
  3. 淺談C#閉包的相關(guān)原理
  4. 淺談C#使用TCP/IP與ModBus進(jìn)行通訊
  5. 漫談Java 7的新特性與C# 2.0的相似之處
責(zé)任編輯:陳貽新 來源: CreateKang
相關(guān)推薦

2024-02-27 10:44:58

C#線程后端

2009-09-01 17:15:42

C#多線程應(yīng)用

2009-08-04 17:57:41

C#線程同步死鎖

2009-09-04 14:41:09

C#同步線程

2009-08-12 18:04:44

編寫C#多線程

2009-08-04 18:00:51

C#線程同步Monitor

2009-08-28 16:43:57

C#多線程學(xué)習(xí)

2009-09-04 15:09:48

C#多線程啟動Squa

2011-06-22 13:57:54

Java多線程

2011-06-22 13:47:16

Java多線程

2009-09-07 13:19:44

C#線程同步

2009-08-26 18:13:55

C#多線程lock

2011-04-25 14:42:10

C#lock

2024-10-21 16:59:37

C#編程多線程

2009-07-17 10:37:05

C#多線程

2009-08-17 16:56:51

C#多線程控制進(jìn)度條

2010-01-21 11:27:30

linux多線程機制線程同步

2012-06-05 02:12:55

Java多線程

2009-07-01 17:34:03

Servlet和JSP

2010-01-18 14:09:58

C++多線程
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产日产欧产精品精品推荐蛮挑 | 精品国产乱码久久久久久丨区2区 | 6996成人影院网在线播放 | 人人做人人澡人人爽欧美 | 免费一看一级毛片 | h片在线观看网站 | 国产日韩欧美在线观看 | 亚洲欧美一区二区三区国产精品 | 日韩精品一区二区三区中文在线 | 国产精品久久久久久久久久久久久久 | 伦理午夜电影免费观看 | 国产玖玖| 欧美日韩国产传媒 | 国产三级 | 亚洲一区欧美一区 | 天天干天天干 | 国产超碰人人爽人人做人人爱 | 日本精品久久久久久久 | 男女免费在线观看视频 | 欧洲视频一区二区 | 欧美一区二区三区电影 | 国产精品自拍视频 | 91久久国产综合久久91精品网站 | 亚洲精品久久久久中文字幕欢迎你 | 综合激情网| 91精品免费 | 在线国产中文字幕 | 成人福利在线观看 | 免费看国产片在线观看 | 国产精品乱码一区二区三区 | 国产激情视频在线 | 国产精品视频一 | 国产一区二区三区 | 国产美女视频一区 | 久久国产免费 | 全部免费毛片在线播放网站 | 久久网日本| 99久久99热这里只有精品 | 国产在线视频一区二区董小宛性色 | 韩日一区二区 | 亚洲精品久久区二区三区蜜桃臀 |