获得锁定后,枚举器线程安全吗?

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次).

Sri*_*vel 6

一点都不.这lock同步只访问_list.GetEnumerator方法; 枚举列表的地方远不止于此.它包括阅读IEnumerator.Current财产,打电话IEnumerator.MoveNext等.

您需要锁定foreach(我假设您通过foreach枚举),或者您需要复制列表.

更好的选择是看看开箱即用的Threadsafe集合.