首页 >后端开发 >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