// 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;}
我有点困惑为什么需要锁.因为如果我们所做的只是汇总一组整数,比如说{1,5,6},那么我们就不需要关心以任何顺序递增的共享和结果.
(1 + 5) + 6 = 1 + (5 + 6) = (1 + 6) + 5 = ...
有人能解释我的思想在哪里有缺陷吗?
我想我的身体方法有点困惑不能简单
int result = 0;Parallel.ForReach(values,(val) => { result += val; }); return result;解决方法 语句结果= localValue;真的是说结果=结果localValue;您正在读取和更新由不同线程共享的资源(变量).这很容易导致竞争条件. lockmakes确保在任何给定时刻该语句由单个线程访问. 总结
以上是内存溢出为你收集整理的c# – 为什么需要锁?全部内容,希望文章能够帮你解决c# – 为什么需要锁?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)