[轉]異步編程及其同步機制

.NET下的異步編程及其發展html

任何平臺和編程語言都會有多線程的實現機制和方法。對於C#來說Thread類就是建立線程,管理線程的一種最初始的手段。可是建立和銷燬一個線程是很耗費資源的,並且建立的線程越多,線程間切換就越頻繁(計算機CPU個數受限),線程切換也要耗費資源和時間,再加上線程管理是一件很費心的事,因此微軟就引入了線程池的概念。線程池是一個先進先出FIFO的隊列,程序員只須要把操做或者任務丟給線程池,讓.NET framework替程序員管理線程,線程複用等,極大的簡化了開發。這裏就有一個控制線程池內線程數量的問題。線程池內的線程確定得根據須要動態變化,但適應這種須要的算法是什麼呢?程序員

          一個簡單的算法:往線程池中增長一些線程,觀察線程池的吞吐量,若是增長後吞吐量增長,說明線程不夠,須要增長線程。但這存在一個問題,對於一個很大的任務須要長時間佔用線程,增長線程並不能增長吞吐量,此時若是增長線程會加劇負擔。因此在CLR v4時引入了本地隊列(Local  Queue)的概念,若是一個線程內建立了另外一個線程,新建立的線程再也不丟給全局隊列,而是給本地隊列排隊等候調用。這就又有個問題,若是一個隊列內任務執行完了,而另外一個隊列還有好多怎麼辦?那就讓執行完任務的本地隊列從該隊列上「偷「一個線程執行。這樣達到負載均衡。固然線程池的算法會隨着CLR版本升級而不斷演進,更加智能的管理線程。對普通開發者而言能夠不用考慮這些細節,無縫的體驗線程池帶來的便利和效率就好了。                  算法

       線程池如此方便,咱們怎麼使用線程池呢?能夠經過如下幾種方式:編程

  • 經過類方法ThreadPool.QueueUserWorkItem直接調用。
  • 經過.net Framework 4.0 引入的TPL(Task Parallel Library)任務並行庫。

         TPL中最主要的兩個類是Task和Parallel。而新版C++標準中也引入了相似的概念parallel_for, parallel_foreach, parallel_invoke等。安全

         詳細信息見如下連接。多線程

  • 經過異步委託(BeginInvoke/EndInvoke)調用。

經過BackgroundWorker, BackgroundWorker是WinForm, WPF下的一個控件,主要用於提供UI控件下的協做式取消,進度報告等。負載均衡

 

NET線程同步機制及線程間數據封送異步

        首先.Net的同步機制是幹什麼的?概況來說是爲了安全。同步機制的存在是由於異步操做是不安全的,會帶來一系列的問題,這些問題在第一章節中已經討論過了。而線程間數據封送和COM與.Net framework數據封送同樣,是爲了線程間數據和狀態的傳遞。編程語言

那麼.net的同步機制有哪些呢?歸納一下:異步編程

  1.   簡單的鎖定方法:Thead類的Sleep, Join等以及Task的Wait方法。
  2.   基於對象的鎖定:

                 lock(Monitor.Enter/Monitor.Exit):首先強調一下它不能夠跨進程間線程同步。通常跨進間線程同步都有一個特徵,就是同步對象都有名字。

                 Mutex和Semophore(slim):這兩個均可以跨進程同步,二者的區別在於:Mutex只能有一等待資源,而Semophore能夠有多個。拿廁所舉例,Mutex至關於廁所中只有一個蹲位,只能一個上了才能上另外一個,而Semophore能夠有多個蹲位,可讓多個線程同時阻塞一個線程的執行。就是n個哥們一塊兒蹲着,又來一哥們,而後這n個哥們就佔着那啥不那啥。

                 Reade/Writer 鎖。

     3.基於信號

                事件等待句柄AutoResetEvent, ManualResetEvent(Slim):注意這兩個也是容許跨進程的,二者用法差很少,使一個線程釋放一個信號從而使得其餘線程可以執行。

                CountdownEvent(4.0被引入):這個和上邊用法正好相反,它使得一個線程等待收到其餘線程的信號後再執行。

                Barrier

                Wait and pulse

     4. 非阻塞的同步結構

                Thread.MemoryBarrier

                Thread.VolatileRead/Write

                Interlocaked 

異步模式

    什麼須要異步模式?所謂模式,實際上是一種方法,就跟上篇博客裏所講的,是從工程實踐中總結出來的解決類似或特定問題的一種慣用手段。常見的異步模式包括:

      APM模式: BeginXXX/EndXXX, IAsyncResult

      EAP模式(基於事件的異步模式)

           Windows Form

           MethodNameAsync

           Event

     TAP(基於任務的異步模式)

           MethodNameAsync

           Task/Task<Result>

     這部份內容如下連接講得很好了,感興趣能夠看一下。更詳盡的介紹去MSDN或者官方網站上去找類似的文檔。

線程安全及異常處理

   新線程中拋出的異常會不會自動封送到主線程中?如何處理新線程中拋出的異常?什麼是線程安全?怎樣作到線程安全?

線程取消

   正在執行的線程怎麼能不能取消,怎麼取消合適?暴力取消?協做式取消?

C#5.0新的異步模式Async和await關鍵字

   請參考我之前的博客:http://www.cnblogs.com/salomon/archive/2012/06/27/2565862.html

 

     後幾章內容實在寫不下去了,先提出問題,之後再補上吧。另外關於講座PPT視頻的內容,不知道原做者是否樂意分享,徵得他本人贊成後我會附上連接。

References

http://www.albahari.com/threading/(詳盡的C#線程介紹)

http://www.danielmoth.com/Blog/New-And-Improved-CLR-4-Thread-Pool-Engine.aspx(線程池介紹)

http://www.codeproject.com/Articles/152765/Task-Parallel-Library-1-of-n(TPL的介紹)

http://www.cnblogs.com/scy251147/archive/2012/03/03/2378477.html(異步模式介紹)

http://www.codeproject.com/Articles/80825/Concurrency-Runtime-in-Visual-C-2010(C++中的並行庫)

http://www.cnblogs.com/yuyijq/archive/2011/02/20/1958925.html

http://www.cnblogs.com/yuyijq/archive/2011/02/22/1960273.html

http://www.cnblogs.com/Zhouyongh/archive/2009/08/31/1557126.html

http://www.cnblogs.com/zhouyongh/archive/2011/01/12/1933414.html

 

原文出處:http://www.cnblogs.com/salomon/archive/2012/06/28/2567339.html

相關文章
相關標籤/搜索