【问题标题】:asp.net - How does parallel.for worksasp.net -parallel.for 如何工作
【发布时间】:2011-03-29 16:35:05
【问题描述】:

parallel.for 是如何工作的。它是否为每个循环调用线程/将循环分成几部分并并行执行?如果是这样,那么我们能否确保与正常 for 循环相同的结果?我测试了性能,它确实使用了多核处理器。但我想知道内部工作是如何工作的

【问题讨论】:

    标签: asp.net .net-4.0 parallel-processing task-parallel-library


    【解决方案1】:

    Parallel.For 为多个并发迭代划分工作。默认情况下,它使用默认任务调度程序来调度迭代,它基本上使用当前线程以及许多线程池线程。有一些重载可以让你改变这种行为。

    并行循环可能看起来与常规循环非常相似,但实际上存在许多重要差异。首先,不能保证迭代的顺序。 IE。代码不能假定任何特定顺序。这样做会导致不可预知的结果。

    此外,由于代码可能在多个线程上运行,因此异常处理与常规 for 循环完全不同。 Parallel.For 将捕获线程的异常并将这些异常作为AggregateException 实例中的内部异常封送回调用线程。

    更多详情请查看Parallel Programming with Microsoft .NET by Microsoft 模式和实践。

    【讨论】:

      【解决方案2】:

      parallel.for 循环在不同进程中并行运行循环的迭代。只有在迭代相互独立时才能使用它。仅当迭代是独立的时,您才能假设并行和非并行 for 循环将产生相同的结果。

      【讨论】:

      • 澄清一下,您也无法控制迭代发生的顺序。
      • @Brian:我认为我们可以通过使用 Interlocked.Increment 来控制迭代发生的顺序。
      • @user329755:这是我的评论 :) 我不太确定 for 结构是否能很好地发挥作用,但我从未尝试过。在我看来,这就像绕过整个 for 机制。
      • 那么并行有什么用??实时应用程序将具有复杂逻辑的循环,而不是我们在示例中使用的循环。那我们怎么用呢。比如PLINQ的使用,如果我在list.findFirst中使用parallel,它会返回哪个对象?
      • 假设您需要向表中插入 1000 行数据。插入是独立的,插入的顺序并不重要。您可以使用 parallel for 进行插入。 (数据库服务器表锁定问题超出了范围:))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      相关资源
      最近更新 更多