作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道返回的枚举数是否是线程安全的:
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/
我是一名优秀的程序员,十分优秀!