【问题标题】:Number of threads being used during Parallel.ForEachParallel.ForEach 期间使用的线程数
【发布时间】:2013-01-29 22:47:08
【问题描述】:

我只是做了一个简单的实验,使用下面的代码显示一个进程中的线程总数。

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

Parallel.ForEach(
            names,
            new ParallelOptions  {MaxDegreeOfParallelism = Environment.ProcessorCount },
            name =>
            {
                Console.WriteLine(name);
            });
Console.Read();
Console.WriteLine("Total Number of Threads: {0}", Process.GetCurrentProcess().Threads.Count);

parallel.foreach 之前有 12 个线程,parallel.foreach 之后有 17 个线程。

问题:

  1. 为什么 Parallel.Foreach 中使用的 5 个线程在循环后继续运行?是否意味着如果我有其他 Parallel.Foreach 在此之后会有更多的线程继续增加?
  2. 为什么 Parallel.Foreach 之前不使用 12 个线程?是不是因为这12个线程正在被其他人使用?

【问题讨论】:

    标签: c# multithreading threadpool


    【解决方案1】:

    从外部看来,这种行为是不确定的。

    Parallel 类使用线程池。对何时创建新线程以及何时使用旧线程做出了一些决定。这还可以提高性能并减少所需的内存量。

    在并行 foreach 之后,一些线程可能(暂时)仍然存在,可用于线程池活动。但据我所知,您无法预测是否会或有多少线程会继续存在。

    【讨论】:

      【解决方案2】:

      我的理解也是,您无法预测将运行多少线程。我遇到了线程数高于我想要的线程数的问题,我使用 AutoResetEvent 进行了处理。

      【讨论】:

      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 2017-08-06
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多