【发布时间】:2015-03-04 18:04:43
【问题描述】:
每个线程是否都有自己可以更改的副本?他们都共享同一个吗?它是线程安全的吗?
X var;
Parallel.Foreach(ls , it => Op(var, It));
Op 对 var 做了一些事情。我假设如果 var 是一个引用(比如List<string>),那么所有线程都共享一个引用,我的工作就是练习安全更新。如果 X 是 int say 呢?
如果 var 是 List<string> 但为空怎么办?如果一个线程创建一个新列表并将其写入var?其他线程看到 var 的新值了吗?
我已经做了一些测试,但我想确保我看到的是真实的,而不是我在编写糟糕的测试。
最后一种情况(null)似乎每个线程都有自己的List<string>
编辑: 看来我需要区分
X var;
Parallel.Foreach(ls , it => Op(var, It));
和
X var;
Parallel.Foreach(ls , it => {
....
var = <something>
....
});
即 lambda 本身会修改变量。在这种情况下,它是共享的。但是在函数(Op)的情况下,关于按值传递的通常规则适用
在共享 var 的情况下,任务并行库是管理并发访问还是我必须这样做?
【问题讨论】: