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

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

Mary-Kate Olsen
發布: 2025-01-03 02:52:38
原創
723 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板