在我开始之前,我应该提一下,我觉得我在这里搞错了。但无论如何我们都走了:
假设我们有以下类:
public class SomeObject {
public int SomeInt;
private SomeObject anotherObject;
public void DoStuff() {
if (SomeCondition()) anotherObject.SomeInt += 1;
}
}
现在,假设我们有这些SomeObject
s 的集合:
IList<SomeObject> allObjects = new List<SomeObject>(1000);
// ... Pretend the list is populated with 1000 SomeObjects here
假设我打电话DoStuff()
给每个人,就像这样:
foreach (var @object in allObjects) @object.DoStuff();
到目前为止一切都很好。现在,让我们假设对象DoStuff()
被调用的顺序并不重要。假设这SomeCondition()
可能在计算上很昂贵。我可以利用我机器上的所有四个内核(并可能获得性能提升):
Parallel.For(0, 1000, i => allObjects[i].DoStuff());
现在,忽略变量访问原子性的任何问题,当我在循环中时,我不在乎是否有任何给定SomeObject
的看到anotherObject
or的过时版本SomeInt
。* 但是,一旦循环完成,我想确保我的主工作线程(即调用 Parallel.For 的线程)确实看到所有内容都是最新的。
使用 Parallel.For 是否可以保证这一点(例如某种内存屏障?)?还是我需要自己做出某种保证?还是没有办法做出这种保证?
最后,如果我Parallel.For(...)
之后以同样的方式再次调用,所有工作线程是否都在使用新的、最新的值?
(*) 的实现者DoStuff()
无论如何都对处理顺序做出假设是错误的,对吧?