Jen*_*nsB 4 c# multithreading c#-4.0
我想知道返回的枚举器是否是线程安全的:
public IEnumerator<T> GetEnumerator()
{
lock (_sync) {
return _list.GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有多个线程将数据(也在lock()块内)添加到此列表中,并且一个线程枚举此列表的内容.枚举线程完成后,清除列表.那么使用从这种方法获得的枚举器是否安全.
即,枚举器指向它所要求的实例的列表副本,还是总是指向列表本身,在枚举期间可能会或可能不会被另一个线程操纵?
如果枚举器不是线程安全的,那么我能看到的唯一其他操作方法是创建列表的副本并返回该列表.然而,这并不理想,因为它会产生大量垃圾(这种方法每秒调用约60次).
一点都不.这lock同步只访问_list.GetEnumerator方法; 枚举列表的地方远不止于此.它包括阅读IEnumerator.Current财产,打电话IEnumerator.MoveNext等.
您需要锁定foreach(我假设您通过foreach枚举),或者您需要复制列表.
更好的选择是看看开箱即用的Threadsafe集合.