c# - 获得锁后枚举器线程安全吗?

标签 c# multithreading c#-4.0

我想知道返回的枚举数是否是线程安全的:

public IEnumerator<T> GetEnumerator()
{
    lock (_sync) {
        return _list.GetEnumerator();
    }
}

如果我有多个线程向这个列表添加数据(也在 lock() block 中),一个线程枚举这个列表的内容。当枚举线程完成后,它会清除列表。那么使用从该方法获得的枚举器是否安全。

即枚举器是指向它被要求实例处的列表副本,还是总是指向列表本身,在枚举期间它可能会或可能不会被另一个线程操纵?

如果枚举器不是线程安全的,那么我能看到的唯一其他操作就是创建列表的副本并返回它。然而,这并不理想,因为它会产生大量垃圾(此方法每秒调用约 60 次)。

最佳答案

不,一点也不。此 lock 仅同步对 _list.GetEnumerator 方法的访问;枚举列表远不止于此。包括读取IEnumerator.Current属性,调用IEnumerator.MoveNext

您要么需要锁定 foreach(我假设您通过 foreach 进行枚举),要么需要复制列表。

更好的选择是查看 Threadsafe collections开箱即用。

关于c# - 获得锁后枚举器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24820270/

相关文章:

c# - 将异步编程模型(开始/结束方法)转换为基于事件的异步模型?

c# - 如何初始化 Amyuni Pdf 库的多个实例?

c++ - 使用互斥体锁定 vector - Boost

c# - 使用表达式树构造具有未知成员的对象

c++ - 多核CPU上32bit读的原子性

c++ - 了解 qthread 子类的运行方法和线程上下文

c# - 根据以前的值实时猜测值

winforms - 如何更改 BarButtonItem 的背景颜色?

C# 编译器没有找到 dll;在VS2010中编译的解决方案

c# - WCF 从 web.config 文件中读取终结点行为