【问题标题】:how TPL decide the number of threads to be createdTPL 如何决定要创建的线程数
【发布时间】:2015-01-19 03:51:11
【问题描述】:

即使我长期使用 TPL,但因为它对我来说听起来很新。我想了解带有线程池的 TPL,我在 .NET 框架 4.0 中创建了一个 POC,如下所示。

 public class CustomData
 {
    public long CreationTime;
    public int Name;
    public int ThreadNum;
 }

 public class TPLSample
 {
    public int MaxThread = 0;
    public void Start()
    {
        Task[] taskArray = new Task[10000];
        for (int i = 0; i < taskArray.Length; i++)
        {
            taskArray[i] = Task.Factory.StartNew((Object obj) =>
            {
                var data = new CustomData() { Name = i, CreationTime = DateTime.Now.Ticks };
                Thread.SpinWait(10000);
                data.ThreadNum = Thread.CurrentThread.ManagedThreadId;
                if (Thread.CurrentThread.ManagedThreadId > MaxThread)
                {
                    MaxThread = Thread.CurrentThread.ManagedThreadId;
                }
                Console.WriteLine("Task #{0} created at {1} on thread #{2}.",
                                  data.Name, data.CreationTime, data.ThreadNum);
            },
                                                 i);
        }
        Task.WaitAll(taskArray);
        Console.WriteLine("Max no of threads {0}", MaxThread);
    }
}

我发现只创建了 14 个线程来完成这个任务!!

但为什么是 14?标准是什么?我可以增加或减少这个数字吗? 我怎样才能改变这个数字。它真的有可能还是完全从开发人员那里抽象出来的。

【问题讨论】:

    标签: c# multithreading task-parallel-library threadpool


    【解决方案1】:

    来自MSDN

    可以排队到线程池的操作数量仅受可用内存的限制;但是,线程池限制了进程中可以同时处于活动状态的线程数。从 .NET Framework 4 开始,进程的线程池的默认大小取决于几个因素,例如虚拟地址空间的大小。进程可以调用 GetMaxThreads 方法来确定线程数。

    另一个MSDN

    TPL 可能会采用各种优化,尤其是在有大量委托的情况下。

    Another SO question about this。希望这能解渴。

    【讨论】:

    • 但是如果它是基于系统内存的,那么我们如何保证代码在所有机器上都能成功运行呢?因为我可能想一起运行最大的进程。但可能是使用 TPL 编写的代码与将创建多少线程无关。如果一个系统允许 100 个线程一起使用,那可能是个问题。
    • @DJ 您可以使用ParallelOptions.MaxDegreeOfParallelism 设置最大进程数,但我相信除非用户有足够的资源来最大化该线程池确定的数量,否则不会使用该最大数量。在您的问题中,我认为围绕您将始终拥有一定数量的线程的概念进行编码并不是一个好主意。您可以设置最大数量,但除此之外,这完全取决于用户系统。
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多