Parallel.For 和 Break() 误解?

2024-05-13

我正在研究 For 循环中的并行性中断。

看完之后this http://tipsandtricks.runicsoft.com/CSharp/ParallelClass.html and this http://reedcopsey.com/2010/01/22/parallelism-in-net-part-3-imperative-data-parallelism-early-termination/我还有一个问题:

我期望这段代码:

 Parallel.For(0, 10, (i,state) =>  
     { 
                Console.WriteLine(i); if (i == 5) state.Break(); 
     }

屈服于most6 个数字 (0..6)。 他不仅没有这样做,而且结果长度也不同:

02351486
013542
0135642

很烦人。 (Break() {after 5} 到底在哪里??)

于是我看了一下msdn

Break 可用于向循环传达当前迭代之后不需要运行其他迭代的信息。 如果从 for 循环的第 100 次迭代开始调用 Break 从 0 到 1000 并行,所有小于 100 的迭代仍然应该是 运行,但从 101 到 1000 的迭代是不必要的。

Quesion #1 :

哪些迭代?总体迭代计数器 ?或每个线程?我很确定它是每个线程的。请批准。

Question #2 :

假设我们使用并行 + 范围分区(由于元素之间没有 cpu 成本变化),因此它在线程之间划分数据。因此,如果我们有 4 个核心(并且它们之间有完美的划分):

core #1 got 0..250
core #2 got 251..500
core #3 got 501..750
core #4 got 751..1000

所以线程在core #1会遇见value=100有时会打破。 这将是他的迭代次数100。 但线程中core #4得到了更多的量子,他就在900现在。他是远远超出 his 100'th迭代。 他的指数没有低于 100 就可以被阻止! -所以他会向他们展示全部。

我对吗 ?这就是我在示例中得到超过 5 个元素的原因吗?

Question #3 :

我怎样才能真正打破(i == 5) ?

p.s.

我的意思是,来吧!当我做Break(),我希望循环停止。 和我平常做的一样For loop.


最多产生 6 个数字 (0..6)。

问题是这不会最多产生 6 个数字.

发生的情况是,当您遇到索引为 5 的循环时,您会发送“中断”请求。Break()将导致循环不再处理任何值>5,但处理所有值<5.

但是,任何已启动的大于 5 的值仍将得到处理。由于各种索引并行运行,它们不再排序,因此您会得到各种运行,其中某些值>5(例如您示例中的 8)仍在执行。

哪些迭代?总体迭代计数器 ?或每个线程?我很确定它是每个线程的。请批准。

这是传递给 Parallel.For 的索引。 Break() 不会prevent项目不被处理,但保证 100 以内的所有项目都得到处理,但 100 以上的项目可能会也可能不会被处理。

我对吗 ?这就是我在示例中得到超过 5 个元素的原因吗?

是的。如果您使用像您所展示的那样的分区器,那么只要您调用Break(),超出您中断的项目将不再被安排。但是,项目(即整个分区)已安排的将得到充分处理。在您的示例中,这意味着您可能始终处理所有 1000 个项目。

当 (i == 5) 时我怎样才能真正打破?

你是 - 但当你并行运行时,事情就会发生变化。是什么实际目标这里?如果您只想处理前 6 项(0-5),则应该限制这些项before您可以通过 LINQ 查询或类似查询循环遍历它们。然后您可以处理 6 个项目Parallel.For or Parallel.ForEach没有Break()并且无忧无虑。

我的意思是,来吧!当我执行 Break() 时,我希望循环停止。正如我在常规 For 循环中所做的那样。

你应该使用Stop() http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallelloopstate.stop.aspx代替Break()如果你想让事情尽快停止。这不会阻止物品已经运行停止,但将不再安排任何项目(包括索引较低或枚举中比您当前位置更早的项目)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Parallel.For 和 Break() 误解? 的相关文章

  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 将 Visual Studio 2012 C++ 单元测试项目链接到 exe 会导致访问冲突

    我从现有的整体 exe 本机 Visual Studio 2012 项目开始 我想添加一个本机单元测试项目 根据http msdn microsoft com en us library hh419385 aspx objectRef ht
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • 接口中的私有成员

    是否可以在 NET 接口中创建私有成员 我听说现在可以了 但我的 IDE 拒绝了 public interface IAnimal void SetDefaultName string name ChangeName name privat
  • 那里有更好的 DateTime.Parse 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个库 付费或免费 能够处理比 DateTime Parse 使用的更常见的日期时间格式 能够
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • CS0246 找不到类型或命名空间名称“ErrorViewModel”(您是否缺少 using 指令或程序集引用?)

    我收到 CS0246 错误代码 我正在做一个 MVC net core 项目 我正在将 Razor 合并到我的 C 代码中 我在进行构建时收到此错误 我在最后一行收到错误 有人能帮我解决这个问题吗 global Microsoft AspN
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi
  • MsBuild 在 Visual Studio Online 上找不到恢复的 NuGet 包

    我尝试构建一个存储在 Visual Studio Online 上的外部 GIT 存储库中的解决方案 它有以下步骤 1 Git 恢复 有效 2 NuGet 恢复 有效 3 构建 不起作用 查看日志时我的第一个猜测是 MsBuild 没有查找
  • 从哪里开始阅读 SQLite 源代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想了解sqlite是如何实现的 并且 想阅读源代码 我已经下载了源代码 我应该开始查看代码的哪一部分 SQLite文档页 http

随机推荐