gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:24:30 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com