CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
生活随笔
收集整理的這篇文章主要介紹了
CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Class Libraries and Thread Safety
- 1.極其乏味易錯;
- 2.鎖嚴重影響性能;
- 3.線程同步鎖在同一時間點僅允許一個線程訪問資源。
一個例外:如果實例方法是用于協調多線程的,那么該實例方法也應該多線程安全。如CancellationTokenSource.Cancel方法。
Primitive User-Mode and Kernel-Mode Constructs
- 用戶模式:速度很快,使用特定的CPU指令協調線程,協調工作由硬件完成。Windows系統不會檢測線程是否阻塞在用戶模式同步結構;
線程池線程阻塞在用戶模式同步結構不會被當成阻塞,線程池不會創建新的線程來代替臨時阻塞的線程。
采用該模式的線程會被系統搶占調度,可能導致線程被反復快速調度,從而會浪費CPU; - 核心模式:Windows操作系統提供,調用實現在系統內核的函數。當一個線程使用內核模式同步結構來請求其他線程持有的資源,Windows將阻塞該線程所以不會浪費CPU;
線程在用戶模式與核心模式間互相轉換會嚴重損害性能; - 如果一個線程持有一個同步結構不再釋放它,等待該結構的線程將永遠被阻塞:
- 活鎖:如果該同步結構是用戶模式,線程一直運行在CPU上;
- 死鎖:如果該同步結構是核心模式,線程被阻塞住;
- 活鎖與死鎖都很糟糕,但相比之下,活鎖更糟糕,因為活鎖既浪費CPU又浪費內存,而死鎖只浪費內存;
User-Mode Constructs
- 易變(volatile)結構:在一個簡單數據類型變量上執行原子讀或寫操作;
- 聯鎖(Interlocked)結構:在一個簡單數據類型變量上執行原子讀和寫操作;
Kernel-Mode Constructs
- 當核心模式同步結構檢測到資源上出現競爭時,Windows阻塞競爭失敗的線程,因此不再浪費處理器資源;
- 核心模式同步結構可以同步本地線程和托管線程;
- 核心模式同步結構可以同步運行在同一臺機器上不同處理器上的線程;
- 核心模式同步結構可以附上安全限制避免未經認證的帳號訪問他們;
- 線程能夠被阻塞直到所有的核心模式同步結構都可用,或者任何一個可用;
- 阻塞在核心模式同步結構上的線程可以設置一個timeout值;如果這段時間內沒能獲得期望的資源,那么不再阻塞以干點其他正事。
- 事件(Events):事件是有內核管理的Boolean變量。當事件為false時,線程被阻塞。有兩種事件:AutoResetEvent、ManualResetEvent;
- 信號量(Semaphore):信號量是內核管理的Int32變量。當信號量為0時,線程被阻塞;>0時,線程不被阻塞。
當鎖上沒有競爭時,SimpleWaitLock比SimpleSpinLock要慢許多,因為SimpleWaitLock的Enter和Leave方法會強制調用線程在托管代碼到核心代碼之間進行來回轉換;
但是當鎖上有競爭時,SimpleWaitLock不會浪費CPU資源,而SimpleSpinLock會不停的輪轉CPU;
- 當多個線程在AutoResetEvent上等待時,設置事件只會讓一個線程不再被阻塞;
- 當多個線程在ManualResetEvent上等待時,設置事件會讓所有線程不再被阻塞;
- 當多個線程在Semaphore上等待時,釋放信號量會讓releaseCount個線程不再被阻塞(relaseCount是Semaphore.Release()方法的參數)。
- 首先,Mutex對象通過查詢調用線程的ID記錄了哪個線程獲得了它。當線程調用ReleaseMutex,Mutex會確認是否為同一線程;
- 其次,Mutex維護一個遞歸計數指出被獲得了多少次。只有當遞歸計數降為0時,其他線程才能獲取。
本章小結
??? 本章講述了原生的線程同步結構,首先介紹了類庫和線程安全性概念,然后對線程同步模式進行了分類:用戶模式與核心模式,接著詳細說明了這兩種同步模式的實現細節,并舉例進行了對比。
轉載于:https://www.cnblogs.com/bengxia/archive/2010/07/01/1768923.html
總結
以上是生活随笔為你收集整理的CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ms SQL Server表自增字段重置
- 下一篇: 线程----BlockingQueue