Dot-Net

何時在 .NET 中使用 lock 與 MemoryBarrier

  • June 30, 2016

在 .NET 中,關鍵字是andlock周圍的語法糖,所以你可以說這段程式碼Monitor.Enter``Monitor.Exit

lock(locker)
{
 // Do something
}

是相同的

Monitor.Enter(locker);
try
{
 // Do Something
}
finally
{
 Monitor.Exit(locker);
}

然而 .NET 框架還包括MemoryBarrier以類似方式工作的類

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();

我很困惑什麼時候想使用Thread.MemoryBarrier/lock版本Monitor一個執行緒教程讓我更加困惑,它指出它們的功能相同。

據我所見,明顯的區別是不需要鎖定對象,我想使用Monitor它可以MemoryBarrier在單個執行緒上跨執行緒執行某些操作。

我的直覺告訴我,另一個關鍵區別是MemoryBarrier僅針對變數而不針對方法。

最後,這與現有問題何時線上程安全鎖定程式碼中使用 ‘volatile’ 或 ‘Thread.MemoryBarrier()’ 無關?(C#),因為它專注於volatile我理解其用法的關鍵字。

在我看來,您幾乎應該使用Thread.MemoryBarrier. 這用於無鎖程式碼 - 確保在一個執行緒上所做的更改對另一個執行緒可見,而不會產生鎖定成本。它不控制執行緒同步,不像lock. 我沒有看到喬的教程中他說MemoryBarrier“功能相同”的地方lock。你能解釋一下你到底是從哪裡得到這種印象的嗎?

在我看來,低級無鎖程式碼對於除了主要精通並發的開發人員之外的幾乎任何人來說都太難了。如果我想編寫一些無鎖程式碼,我將使用那些開發人員建構的更高級別的建構塊(例如 .NET 4.0 中的並行擴展),而不是嘗試自己編寫。

舉個例子,我最近睜大了眼睛,volatile它的確切含義不是“總是從主記憶體儲器讀取,總是直接寫入主記憶體儲器”。(我自己的執行緒教程目前仍然有這個解釋——我需要在某個時候修復它。)它遠比那更微妙。這意味著我之前的一些使用volatile很可能是不正確的。

引用自:https://stackoverflow.com/questions/2005211