而且,不只编译器会调整顺序,CPU也会。在Pentium那代处理器的时代,就已经出现了乱序执行(Out of Order)和分支预测。因为一个指令不会用到所有的计算单元,总会有些计算单元闲置浪费。为了充分利用,处理器会积极的获取后面的指令,并尽可能安排提前执行,以提高处理速度。其次,在多核处理器上,多层级的Cache也会导致处理核心观测到的内存数据变化时间发生变化,其效果可等价于指令顺序变化。
问曰:何为Future?何为Promise?
Future是一个提供“可能未来才能取得的结果”的对象,是异步程序会常用的对象,是只读的。Promise用于实现Future提供者一方,是相对底层一点的代码才会用到的对象,是Future的生产者,是只写的。.NET里使用的类名比较通俗,future叫Task,而promise叫TaskCompletionSource。试看:
C++ 11:
future<int> f = async(func);
...
int v = f.get();
C#:
Task<int> t = Task.Run(func);
...
int v = t.Result;
通常,能应用Parallel for的代码都和集合操作相关,而集合操作,在支持列表推导式(List comprehension)或查询推导式(Query comprehension)的语言里,通常使用这些更便捷的语法来实现。如.NET的LINQ。这些代码可以被自动并行化(对函数式语言)或显示指定(对非函数式语言)并行化。
C#例:
var result = from r in records.AsParallel()
let t = Foo(r)
where t.Bar > 100
select t;
并行与否的唯一区别就是是否调用AsParallel()。当然,要并行,程序员要自己保证LINQ表达式里的操作没有side effect。