程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 淺談.NET下的多線程和並行計算(三)線程同步基礎 上

淺談.NET下的多線程和並行計算(三)線程同步基礎 上

編輯:關於ASP.NET

其實,如果線程都是很獨立的,不涉及到任何資源訪問的,那麼這些毫無干擾的線程不會產生什麼問 題。但是在實際應用中我們的線程總是涉及到資源訪問的,而且往往涉及到共享資源的訪問,那麼就產生 了線程同步的問題。一直覺得線程同步這個名詞很奇怪,字面上看同步就是使得步調一致,線程同步是不 是就是讓線程步調一致的訪問資源呢?事實上反了,線程同步恰巧是讓線程不同時去訪問資源而是去按照 我們期望的順序依次訪問資源(是同步資源訪問的行為而不是同步同時訪問資源)。一句話,多個線程( 不僅僅局限於相同進程)如果需要訪問相同的可變資源的話就可能需要考慮到線程同步的手段。還有兩個 常見的名詞是線程安全和線程沖突,所謂線程沖突就是由於多線程訪問共享資源帶來的問題,某個操作是 線程安全就是表明這個操作沒有線程沖突問題,要達到線程安全就要用線程同步的手段來解決。在MSDN類 庫中可以看到方法都注明了是不是線程安全的,如果不是那麼我們在多線程程序總使用這個方法的話就要 考慮是否要線程同步了。

既然要讓線程的步調一致,那麼我們首先可以想到的是,如果一個線程沒有完成我們就等,一直等到 它完成:

Stopwatch sw = Stopwatch.StartNew();
Thread t1 = new Thread(() =>
{
   Thread.Sleep(1000);
   result = 100;
});
t1.Start();
Thread.Sleep(500);
while (t1.IsAlive) ;
Console.WriteLine(sw.ElapsedMilliseconds);
Console.WriteLine(result);

假設線程在完成後會把結果寫入result這麼一個靜態的變量,主線程在啟動了新線程之後只花了500毫 秒就做好了自己的事情,接下去一定要等待線程計算完成之後才能進行後續的操作,這個時候我們通過不 斷詢問線程是不是還存在來得知線程是不是完成了計算,500毫秒後返回結果:

由於我們主線程是采用循環來等待的,對於處理器來說可不是等待,它足足運算了500毫秒,也就是浪 費了500毫秒處理器資源。其實,我們可以在循環中讓線程休眠一小段時間,讓出處理器時間片,然後再 去輪詢檢查,這樣雖然不能在線程一完成後就得到結果,但是卻節省了處理器資源:

Stopwatch sw = Stopwatch.StartNew();
Thread t1 = new Thread(() =>
{
   Thread.Sleep(1000);
   result = 100;
});
t1.Start();
Thread.Sleep(500);
while (t1.IsAlive)
   Thread.Sleep(500);
Console.WriteLine(sw.ElapsedMilliseconds);
Console.WriteLine(result);

結果如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved