首頁 >後端開發 >C++ >如何處理'收集”;枚舉操作可能不會在多線程環境中執行'錯誤”錯誤?

如何處理'收集”;枚舉操作可能不會在多線程環境中執行'錯誤”錯誤?

DDD
DDD原創
2025-02-02 03:46:10471瀏覽

How to Handle

地址“修改:枚舉操作可能會失敗”錯誤

>

>錯誤“集合已修改;枚舉操作可能不會執行”,當收集在迭代時被更改時,會導致不可預測的行為。這通常發生在多線程的各個方案中,其中多個線程同時訪問和修改同一集合。

這個特定的錯誤在NotifySubscribers()>方法中表現出來,其中subscribers字典在foreach>循環中訪問。 同時修改此詞典(例如,客戶端訂閱或取消訂閱)無效枚舉。

>

>解決方案:實施線程安全

> 為了解決這個問題,字典的線程安全至關重要。 建議採用兩種方法:

subscribers

  1. >使用

    >用ConcurrentDictionary替換標準字典。此數據結構本質上是線程安全,可以防止錯誤。 > ConcurrentDictionary<TKey, TValue>

  2. 創建一個迭代的副本:

    循環之前,使用創建 dictionary值的副本。 這會創建一個快照,不受後來對原始字典的修改影響,從而確保了安全的枚舉。 foreach> subscribers subscribers.Values.ToList()

  3. 代碼示例:

這是修改為使用的方法:>

>這是使用NotifySubscribers()創建安全副本的版本:ConcurrentDictionary>

<code class="language-csharp">public void NotifySubscribers(DataRecord sr)
{
    foreach (Subscriber s in subscribers.Values) // subscribers is now a ConcurrentDictionary
    {
        try
        {
            s.Callback.SignalData(sr);
        }
        catch (Exception e)
        {
            DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error);
            UnsubscribeEvent(s.ClientId);
        }
    }
}</code>
>通過實施這些解決方案中的任何一種,您可以確保線程安全並防止“收集”錯誤...

以上是如何處理'收集”;枚舉操作可能不會在多線程環境中執行'錯誤”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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