CLR via C# 讀書筆記 4-1 線程同步-常見的鎖,原生用戶模式和核心模式 (上)
本文主要描述為了保證線程同步和數據安全采用的若干種不同方案
以鎖為例:
1.用戶模式(User-Mode)比核心模式(Kernel-Mode)快很多
2.windows操作系統無法發現用戶模式的鎖 (即使已經被Blocked了) ,所以線程池也不會為此新建一個線程處理新的請求
3.核心模式的鎖可以使得線程停止運行, 這樣就不會浪費CPU,只是浪費內存(條件滿足的時候,windows會喚醒之前休眠的線程繼續執行)
4.用戶模式的鎖定,其實線程還在運行,浪費CPU和內存
5.核心模式的鎖會極大的損害性能
PS:用戶模式的永久鎖定稱為livelock ,核心模式的永久鎖定稱為 deadlock
綜合考慮到以上的情況
那么在鎖定時間很短的情況下 應該優先考慮用戶模式
在鎖定時間比較長的時候,應該優先考慮核心模式,因為他在等待的時候不會浪費CPU (個人覺得所有等待超過1ms的都應該用核心模式)
FCL原生的用戶模式鎖有兩種:(強烈推薦在多線程程序中應用InterLocked)
1.Volatile , 將一個簡單數據類型標記為volatile將使得這個變量的讀寫操作變為原子的 (不要為了方便吧所有的變量標記為volatile)
2.InterLocked ,這個類封裝了一些對于簡單數據類型的操作,例如Exchange,CompareExchange,Add (這個類是非常有用的)
PS:我不明白為什么InterLocked不支持Boolean這種簡單數據類型......
名詞翻譯:
用戶模式(User-Mode)
核心模式(Kernel-Mode)
浙公網安備 33010602011771號