提出的問題涉及 C# 執行緒在讀取另一個執行緒上修改的 bool 值時的行為線。一些文章表明讀取線程可能會緩存舊值,從而可能導致無限循環。
雖然為了線程安全而鎖定變數是一個很好的做法,但 .NET運行時旨在抽像出與易失性記憶體相關的問題。然而,根據該領域的專家的說法,在提供的範例中觀察到的行為並不受規範的保證。
範例程式碼呈現了一個在之間共享的布林值(停止)兩個執行緒。一個執行緒在 5 秒延遲後將該值設為 true,而另一個執行緒在循環中不斷讀取該值。理論上,如果沒有適當的同步(例如鎖),讀取執行緒可能會快取初始假值並且永遠不會讀取更新後的真值。
儘管在文章中,已經示範了一個可重複的反例:
// using System.Threading; private static bool stopping = false; // Make volatile to fix the issue static void DoWork() { int i = 0; while (!stopping) { i++; } Console.WriteLine("DoWork exit " + i); }
在這種情況下,將stopping設定為true後,DoWork線程繼續無限期地運行,表示舊值正在被緩存。
為了確保正確的行為,將共享變數標記為易失性至關重要,這會增加記憶體屏障並阻止最佳化這可能會導致快取。或者,使用鎖定來同步對變數的存取也可以解決該問題。
以上是C# 執行緒能否快取布林值,而忽略其他執行緒的更新?的詳細內容。更多資訊請關注PHP中文網其他相關文章!