我想知道返回的枚举数是否是线程安全的:
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/