Dot-Net
AutoResetEvent、ManualResetEvent 與監視器
假設我必須在 .Net 3.5 SP1 中編排同步算法,並且標題中列出的任何同步原語都非常適合該任務。
從性能的角度來看,有沒有哪一個比其他的性能更好?
我問這個是因為我已經編碼了一段時間,但對這個主題沒有適當的了解。
如果可以,請使用 Monitor。它類似於 CRITICAL_SECTION。AutoResetEvent/ManualResetEvent 的成本可能會稍多一些,因為它們可以由不同的程序共享,而 Monitor 屬於單個程序。
WaitHandles 看起來與 Wait/Pulse Constructs 非常相似,但區別在於細節:WaitHandles Set 方法,即使沒有執行緒在等待,也會設置 Signal。這意味著如果您在一個執行緒中呼叫 Set,然後在同一等待句柄上的另一個執行緒中呼叫 WaitOne,則第二個執行緒將繼續。Wait 和 Pulse 不同,Pulse 僅向已經在等待隊列中的執行緒發出信號。這意味著如果您在一個執行緒中呼叫 Pulse,然後在同一對像上的另一個執行緒中呼叫 Wait,則第二個執行緒將永遠等待(死鎖)。如果使用 Wait 和 Pulse,你必須非常小心,只有在你知道自己在做什麼的情況下才使用它,否則你可能會很幸運……
要使用 Monitor、weather AutoReset 或 ManualReset 自己創建 WaitHandle 的行為,您需要做的不僅僅是簡單的等待/脈衝構造。只需使用完成工作所需的工具:
如果您無法通過簡單的鎖定或原子操作來同步執行緒,請考慮使用 WaitHandles。如果您無法使用 WaitHandles 同步執行緒,請考慮使用 Wait 和 Pulse。