首页 新闻 赞助 找找看

这段代码有什么问题?

0
悬赏园豆:10 [已解决问题] 解决于 2015-07-09 10:48

 var source = Enumerable.Range(0,1000000);
            var target = new List<int>();
            Parallel.ForEach(source, i => {
                                            if (i % 2 == 0)
                                                 target.Add(i);
                             });

猪小娣的主页 猪小娣 | 初学一级 | 园豆:190
提问于:2015-07-08 22:37
< >
分享
最佳答案
0

target.Add(i) 需要加锁,你也可以使用 Parallel.ForEach 的其它重载版本,可以使用 local 存储,最后合并多个 local。

收获园豆:3
Launcher | 高人七级 |园豆:45045 | 2015-07-09 09:19
其他回答(4)
0

获取0-1000000内的能被2整除的数

吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-09 07:47
0

target.Add(i);  需要加锁

收获园豆:1
长蘑菇星人 | 园豆:1832 (小虾三级) | 2015-07-09 08:35

然而并不需要....我是说真的

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-09 09:18
0
var source = Enumerable.Range(0, 1000);
            var target = new List<int>();
            Parallel.ForEach(source, i =>
            {
                if (i % 2 == 0)
                {
                    lock (target)
                    {
                        target.Add(i);
                    }
                }
            });
收获园豆:3
XiaoFaye | 园豆:3087 (老鸟四级) | 2015-07-09 08:42
0

如2,3楼所言,target是个共享资源,在并行操作下如果不加锁控制下,可能出现的情况就是这里target获取不到正确的值,可能存在值遗漏情况,当然这也不是绝对的,运气好点target得到的值也会是正确的

收获园豆:3
visonme | 园豆:1674 (小虾三级) | 2015-07-09 08:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册