首頁 >後端開發 >C++ >C# 執行緒能否快取布林值,而忽略其他執行緒的更新?

C# 執行緒能否快取布林值,而忽略其他執行緒的更新?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-03 02:52:38729瀏覽

Can a C# Thread Cache a Boolean Value, Ignoring Updates from Other Threads?

C# 執行緒可以快取值並忽略其他執行緒上的變更嗎?

提出的問題涉及 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn