【发布时间】:2012-06-19 15:01:09
【问题描述】:
我想知道 Linq 扩展方法是否是原子的?或者我是否需要在任何类型的迭代之前 lock 跨线程使用的任何 IEnumerable 对象?
将变量声明为volatile 对此有什么影响吗?
总结一下,以下哪个是最好的、线程安全的操作?
1- 没有任何锁:
IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
2- 包括锁语句:
IEnumerable<T> _objs = //...
lock(_objs)
{
var foo = _objs.FirstOrDefault(t => // some condition
}
3- 将变量声明为 volatile:
volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
【问题讨论】:
-
它们不是线程安全的。见stackoverflow.com/questions/9995266/…
标签: c# multithreading thread-safety atomic