首页 文章

Parallel.For(Foreach)将创建多少个线程?默认MaxDegreeOfParallelism?

提问于
浏览
13

我想知道,当我运行Parallel.For / ForEach循环时将使用多少个线程 .

我发现,它可以通过MaxDegreeOfParallelism选项进行更改 .

MSDN上的MaxDegreeOfParallelism帮助说(link):

默认情况下,For和ForEach将使用底层调度程序提供的许多线程,因此从默认值更改MaxDegreeOfParallelism仅限制将使用多少并发任务 .

但我不知道调度程序提供了多少个线程 .

How can I find out that?

我可以用9999999运行循环测试它,但是这个测试会显示数字,但不是确定该数字的规则 .

稍后编辑/添加:

我用google搜索了"sheduler max concurrency",我发现(在MSDN - link), TashSheduler 类有 MaximumConcurrencyLevel 属性,并且:

返回表示最大并发级别的整数 . 默认调度程序返回Int32.MaxValue .

That TaskSheduler class is used as "underlying scheduler" for these parallel loops?

1 回答

  • 13

    根据MSDN

    任务并行库和PLINQ的默认调度程序使用.NET Framework ThreadPool来排队和执行工作 . 在.NET Framework 4中,ThreadPool使用System.Threading.Tasks.Task类型提供的信息来有效地支持并行任务和查询经常表示的细粒度并行性(短期工作单元) .

    查看 ThreadPooldocumentation,它说:

    每个进程有一个线程池 . 从.NET Framework 4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小 . 进程可以调用GetMaxThreads方法来确定线程数 . 可以使用SetMaxThreads方法更改线程池中的线程数 .

相关问题