use*_*000 3 .net c# parallel-processing
我正在看一个关于p的例子.斯蒂芬克莱里的40本书就是这本书
// Note: this is not the most efficient implementation.
// This is just an example of using a lock to protect shared state.
static int ParallelSum(IEnumerable<int> values)
{
object mutex = new object();
int result = 0;
Parallel.ForEach(source: values,
localInit: () => 0,
body: (item, state, localValue) => localValue + item,
localFinally: localValue =>
{
lock (mutex)
result += localValue;
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
我有点困惑为什么lock需要它.因为如果我们所做的只是总结ints 的集合{1, 5, 6},那么我们就不需要关心result以任何顺序递增的共享和.
(1 + 5) + 6 = 1 + (5 + 6) = (1 + 6) + 5 = ...
Run Code Online (Sandbox Code Playgroud)
有人能解释我的思想在哪里有缺陷吗?
我想我的身体方法有点困惑不能简单
int result = 0;
Parallel.ForReach(values, (val) => { result += val; });
return result;
Run Code Online (Sandbox Code Playgroud)
Han*_*ney 10
添加等操作不是原子操作,因此不是线程安全的.在示例代码中,如果省略了锁,则完全有可能在几乎同时执行两个加法运算,导致其中一个值被覆盖或错误地添加.有一个方法是线程安全的递增整数:Interlocked.Add(int, int).但是,由于没有使用,因此在示例代码中需要锁定以确保一次完成一个非原子加法操作(按顺序而不是并行).