【发布时间】:2014-09-09 07:29:45
【问题描述】:
我想知道返回的枚举器是否是线程安全的:
public IEnumerator<T> GetEnumerator()
{
lock (_sync) {
return _list.GetEnumerator();
}
}
如果我有多个线程正在向此列表添加数据(也在lock() 块内),并且一个线程枚举此列表的内容。当枚举线程完成时,它会清除列表。那么使用从这个方法得到的枚举器是否安全。
即枚举器是指向它被请求的实例的列表副本,还是总是指向列表本身,在枚举期间可能会或可能不会被另一个线程操作?
如果枚举器不是线程安全的,那么我能看到的唯一其他操作是创建列表的副本并将其返回。然而,这并不理想,因为它会产生大量垃圾(这种方法每秒调用大约 60 次)。
【问题讨论】:
-
对于 T 列表,不,不是。您可能需要考虑不可变集合 (msdn.microsoft.com/en-us/library/dn385366(v=vs.110).aspx),或者至少考虑明确线程安全的集合,例如 ConcurrentQueue
-
是的
ConcurrentQueue似乎符合要求,谢谢! -
如果有人对 MS 如何完成 ConcurrentQueue 感兴趣,我在这里找到了他们的代码实现:dotnetframework.org/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/…(非常慢的网页)
-
是否有人可以指出 ConcurrentQueue 如何实现其线程安全的文档?我假设它的实现会比我能做的更好,但很高兴看到微软的工程师做了什么。
标签: c# multithreading c#-4.0