Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将foreach循环更改为Parallel.ForEach和奇怪的错误

将foreach循环更改为Parallel.ForEach和奇怪的错误
EN

Stack Overflow用户
提问于 2012-07-23 16:45:46
回答 2查看 849关注 0票数 4

我有几个使用传统语法编写的循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach(x in xs) {....}

其中一些循环在计算方面相当密集,我只是使用如下的并行语法对它们进行了更改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Parallel.ForEach(x, xs => {...});

我看到性能有了很大的提高!现在我的问题是:我是否引入了使用并行多线程的bug?我读到线程安全是复杂的,可能会产生奇怪的bug;我应该关注什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-23 16:57:09

访问共享状态很可能不会产生期望的结果。简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int sum = 0;
for (int i = 0; i < 1000000; i++)
{
    sum++;
}

将其更改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Parallel.For(0, 1000000, i => { sum++; });

你会看到sum会有一些随机值,因为多线程正在读/写sum

如果锁定更新,就可以解决问题,但本质上会再次将操作转换为顺序操作。

您需要确保循环中发生的任何事情都是安全的。

微软的模式和实践做了a book,解释了这一切甚至更多。在简单地将代码更改为使用并行循环之前,您应该先检查一下。

票数 4
EN

Stack Overflow用户

发布于 2012-07-23 16:51:56

确切地说--发布你的迭代/循环代码。

但总的来说,您的迭代应该彼此独立,并尽量避免共享状态。任何与并行迭代资源交叉的共享资源都可能引入bug。

此外,当您的计算依赖于一些其他计算或并行操作或循环时,最好使用TPL任务链,这也有助于避免共享跨线程资源。

更多信息、示例和模式/反模式在微软的免费书籍《并行编程的模式:使用.NET框架理解和应用并行模式4》中有很好的描述

请在此处下载

http://www.microsoft.com/en-us/download/details.aspx?id=19222

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11616833

复制
相关文章
Parallel.For循环 和 Parallel.ForEach循环
但是,有的时候又不是这样。如果迭代之间彼此独立,并且程序运行在多核处理器的机器上,如果能将不同的迭代放在不同的处理器上并行处理的话,将会受益匪浅。Parallel.For 和 Parallel.ForEach结构就是这样做的。
全栈程序员站长
2022/09/09
2.7K0
Parallel.For循环 和 Parallel.ForEach循环
Parallel.ForEach 使用多线程遍历循环
原地址路径:https://www.cnblogs.com/personblog/archive/2019/10/09/11640801.html
全栈程序员站长
2022/09/09
1.4K0
C#如何:编写简单的 Parallel.ForEach 循环
本文档使用 lambda 表达式在 PLINQ 中定义委托。 如果不熟悉 C# 或 Visual Basic 中的 lambda 表达式,请参阅 PLINQ 和 TPL 中的 Lambda 表达式。
全栈程序员站长
2022/09/09
1.6K0
.net Parallel.Foreach的Continue和Break和Return;
var parallelOption = new ParallelOptions() { MaxDegreeOfParallelism = 6 };
全栈程序员站长
2022/09/09
8790
Parallel.ForEach与foreach相比的优势怎么体现[通俗易懂]
输出过程中,明显看到第二个循环比第一个快了很多很多,但是看最后的时间差却失望了:
全栈程序员站长
2022/09/09
5890
Parallel.ForEach与foreach相比的优势怎么体现[通俗易懂]
for和foreach循环语句
今天我们来讲解一下 for跟foreach 一、for 是一个循环语句 for break continue 从 i=0开始,到i=10结束,每次循环 for (i = 1; i <= 10; echo $i; } for (i = 10; i >0; echo $i; } //for可以嵌套 for (i = 1; i <= 10; for (j = 1; j <= 10; continue; echo i.j; } if($i==5) bre
老雷PHP全栈开发
2020/07/02
2.9K0
C#并发实战Parallel.ForEach使用
前言:最近给客户开发一个伙食费计算系统,大概需要计算2000个人的伙食。需求是按照员工的预定报餐计划对消费记录进行检查,如有未报餐有刷卡或者有报餐没刷卡的要进行一定的金额扣减等一系列规则。
梁规晓
2019/08/16
1.5K0
C#并发实战Parallel.ForEach使用
C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解
最近要做一个大数据dataTable循环操作,开始发现 运用foreach,进行大数据循环,并做了一些逻辑处理。在循环中耗费的时间过长。后来换成使用Parallel.ForEach来进行循环。 一开始认为, 数据比较大时,Parallel.ForEach肯定比 ForEach效率高,后来发现,其实并不是这样。
全栈程序员站长
2022/09/09
1.2K0
C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解
C#并发实战Parallel.ForEach使用
前言:最近给客户开发一个伙食费计算系统,大概需要计算2000个人的伙食。需求是按照员工的预定报餐计划对消费记录进行检查,如有未报餐有刷卡或者有报餐没刷卡的要进行一定的金额扣减等一系列规则。一开始我的想法比较简单,直接用一个for循环搞定,统计结果倒是没问题,但是计算出来太慢了需要7,8分钟。这样系统服务是报超时错误的,让人觉得有点不太爽。由于时间也不多就就先提交给用户使用了,后面逻辑又增加了,计算时间变长,整个计算一遍居然要将近10分钟了。这个对用户来说是能接收的(原来自己手算需要好几天呢),但是我自己接受不了,于是就开始优化了,怎么优化呢,用多线程呗。
全栈程序员站长
2022/09/06
1.1K0
C#并发实战Parallel.ForEach使用
C#并行计算 Parallel.ForEach[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161792.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
7850
一个简单的Parallel.ForEach实现
在.net的Task Parallel Library中有一个很方便的功能Parallel.ForEach,可以实现多任务的并发执行,另外还带着栅栏功能,非常好用。但是这一功能必须需要clr4.0支持(CTP版的不大好用),对于低版本的.net要实现类似功能只有自己写一个了。
全栈程序员站长
2022/09/09
4610
奇怪的死循环
#include<stdio.h> int main() { int i; int a[10]; for(i=0;i<=10;++i) { a[i]=0; printf("%d\n",a[i]); } return 0; } 该程序对应的汇编代码见如下代码: .file "cs18.c" .section .rodata .LC0: .string "%d\n" .text .gl
chinchao.xyz
2022/04/25
1.3K0
C#中如何使用Parallel.For和Parallel.ForEach
利用C#中的无锁,线程安全的实现来最大化.NET或.NET Core应用程序的吞吐量。
苏州程序大白
2021/08/13
6.1K0
C#中如何使用Parallel.For和Parallel.ForEach
java退出foreach循环_forEach方法如何跳出循环[通俗易懂]
3.1 foreach()不能使用break和continue这两个关键字,foreach和普通的for循环是不同的,它不是普通的遍历,实现continue的效果可以直接使用return。
全栈程序员站长
2022/09/01
15K0
Java 中for循环和foreach循环哪个更快?
在Java编程中,循环结构是程序员常用的控制流程,而for循环和foreach循环是其中比较常见的两种形式。关于它们哪一个更快的讨论一直存在。本文旨在探究Java中的for循环和foreach循环的性能差异,并帮助读者更好地选择适合自身需求的循环方式。通过详细比较它们的遍历效率、数据结构适用性和编译器优化等因素,我们将为大家揭示它们的差异和适用场景,以便您能够做出更明智的编程决策。
葡萄城控件
2023/10/16
6210
Java 中for循环和foreach循环哪个更快?
Parallel.ForEach并行异步执行导致程序崩溃[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161798.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
6060
c# 中for和foreach循环的区别
    (2)效率比for要高(C#是强类型检查,for循环对于数组访问的时候,要对索引的有效值进行检查)
vv彭
2020/10/27
4.9K0
c# 中for和foreach循环的区别
增强For循环(foreach)
(1)只能顺序遍历所有元素,无法实现较为复杂的循环,如在某些条件下需要后退到之前遍历过的某个元素,不能完成
星哥玩云
2022/09/14
2.2K0
cssjshtml js 循环forEach
 js 循环forEach const names=new Array() resp.series.forEach(function (item,index) { names.push(item['name']) })
葫芦
2019/04/17
6.3K0
Java中的增强 for 循环 foreach
  foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理。能够提高性能,并减少代码出错的几率。在
IT可乐
2018/01/04
3.1K0
Java中的增强 for 循环   foreach

相似问题

将foreach循环更改为Parallel.ForEach循环

23

将Parallel.ForEach改为更好的方法

10

parallel.foreach和httpclient -奇怪的行为

02

Parallel.ForEach的奇怪行为

22

暂停Parallel.Foreach循环

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文