通過設置信號來讓線程停下來或讓線程重新啟動
AutoResetEvent 壹次只喚醒壹個線程,而 ManualResetEvent 可以喚醒多個線程。
AutoResetEvent.WaitOne() 每次只允許壹個線程進入,當某個線程得到信號後, AutoResetEvent 會自動將信號設置為不發送狀態, 其他調用 WaitOne 的線程只有繼續等待.
當某個線程調用了ManualResetEvent.Set() 方法後,除非手工調用 ManualResetEvent.Reset()方法,否則 ManualResetEvent 將壹直保持有信號狀態,其他調用 WaitOne 的線程獲得信號得以繼續執行。
為多個線程***享的變量提供原子操作。
如果壹條語句在底層處理器上被當作壹個獨立不可分割的指令,那麽它本質上是原子的(atomic)。嚴格的原子性可以阻止任何搶占的可能。對於 32 位(或更低)的字段的簡單讀寫總是原子的。而操作 64 位字段僅在 64 位運行時環境下是原子的,並且結合了多個讀寫操作的語句必然不是原子的:
應使用常量進行exchange後的對比邏輯,因為使用變量,讀變量未必原子性( 使用 Interlocked.Exchange 進行邏輯判斷 Debug 與 Release 模式不壹致的經驗教訓 )
When should the volatile keyword be used in C#?
Sayonara volatile
c# - Volatile keyword usage vs lock
Understand the Impact of Low-Lock Techniques in Multithreaded Apps
雙重檢查鎖定(延遲初始化):
使用布爾值指示初始化
WaitHandle.WaitAll
[參考]
C# 理解 AutoResetEvent 和 ManualResetEvent
ManualResetEvent
volatile
C# Interlocked 筆記
Interlocked 類
ReaderWriterLockSlim
ThreadPool 類
ThreadPool.QueueUserWorkItem
WaitHandle.WaitAll
C# 線程安全集合
為什麽 Redis 選擇單線程模型 [ 註:Redis知識領域中剖析精華 ]