1

我刚刚使用这个链接做了一个多线程示例,如下所示:

Console.WriteLine("Number of Threads: {0}", System.Diagnostics.Process.GetCurrentProcess().Threads.Count);            
int count = 0;
Parallel.For(0, 50000, options,(i, state) =>
{
            count++;                
});

Console.WriteLine("Number of Threads: {0}", System.Diagnostics.Process.GetCurrentProcess().Threads.Count);
Console.ReadKey();

它在Parellel.For之前给了我 15 个线程,之后只给了我 17 个线程。所以只有 2 个线程被Parellel.For占用。

然后我使用这个链接创建了另一个示例代码,如下所示:

var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Console.WriteLine("MaxDegreeOfParallelism : {0}", Environment.ProcessorCount * 10);
Console.WriteLine("Number of Threads: {0}", System.Diagnostics.Process.GetCurrentProcess().Threads.Count);            
int count = 0;
Parallel.For(0, 50000, options,(i, state) =>
{
            count++;                
});

Console.WriteLine("Number of Threads: {0}", System.Diagnostics.Process.GetCurrentProcess().Threads.Count);
Console.ReadKey();

在上面的代码中,我将MaxDegreeOfParallelism设置为 40,但仍为Parallel.For.

那么如何增加运行线程Parallel.For呢?

4

3 回答 3

2

我面临一个问题,即当我在其中执行一些繁重而复杂的功能时,Parallel.For 中跳过了一些数字。所以在这里我想增加最大线程并覆盖跳过问题。

你说的是这样的:“我的车开得太快时会晃动。我试图通过开得更快来避免这种情况。” 这没有任何意义。您需要的是修理汽车,而不是改变速度。

究竟如何做到这一点取决于您在循环中实际执行的操作。您显示的代码显然是占位符,但即使这样也是错误的。所以我认为你应该首先学习线程安全

使用锁是一种选择,也是最容易正确使用的一种选择。但也很难使其高效。您需要的是每次迭代只锁定很短的时间。

还有其他选项如何实现线程安全,包括使用Interlocked使用线程本地数据的重载Parallel.For和除 之外的方法Parallel.For(),如 PLINQ 或 TPL 数据流。


在您确定您的代码是线程安全的之后,才该考虑诸如线程数之类的事情。对此,我认为有两点需要注意:

  • 对于 CPU 密集型计算,使用比 CPU 拥有的内核数更多的线程没有意义。使用比这更多的线程实际上通常会导致代码变慢,因为在线程之间切换会产生一些开销。
  • 我认为您无法测量Parallel.For()那样使用的线程数。Parallel.For()使用线程池,很可能在循环开始之前池中已经有一些线程。
于 2016-04-06T18:42:43.437 回答
1

并行循环使用硬件 CPU 内核。如果您的 CPU 有 2 个内核,那么这是您的机器可以获得的最大并行度。

取自 MSDN:

期待什么

默认情况下,并行度(即硬件中同时运行多少次迭代)取决于可用内核的数量。在典型情况下,您拥有的内核越多,您的循环执行速度就越快,直到您达到阿姆达尔定律预测的收益递减点。快多少取决于您的循环所做的工作类型。

进一步阅读:

于 2016-04-06T06:29:18.657 回答
0

对于没有锁的求和运算,并行循环会给您错误的结果,因为每次迭代的结果都取决于单个变量“Count”,并且并行循环中“Count”的值是不可预测的。但是,在并行循环中使用锁并不能实现实际的并行性。所以,你应该尝试其他方法来测试并行循环而不是求和。

于 2017-02-26T07:44:49.200 回答