Parallel.ForEach是否限制活动线程的数量?

给出以下代码:


var arrayStrings = new string[1000];

Parallel.ForEach<string>(arrayStrings, someString =>

{

    DoSomething(someString);

});

所有1000个线程会几乎同时生成吗?


四季花海
浏览 300回答 3
3回答

汪汪一只猫

在单核计算机上...集合的Parallel.ForEach分区(块)在多个线程之间工作,但是该数目是根据考虑了算法的算法计算出来的,并且似乎不断监视由线程执行的工作分配给ForEach的线程。因此,如果ForEach的主体部分调用长时间运行的IO绑定/阻塞函数,这会使线程处于等待状态,则该算法将产生更多线程并在它们之间重新分配集合。例如,如果线程快速完成并且不阻塞IO线程,例如仅计算一些数字,该算法将增加(或什至减少)线程数,使算法认为吞吐量最佳(每次迭代的平均完成时间)。基本上,所有各种Parallel库函数后面的线程池都将确定要使用的最佳线程数。物理处理器内核的数量仅构成等式的一部分。内核数与产生的线程数之间没有简单的一对一关系。我发现有关取消和处理同步线程的文档没有什么帮助。希望MS可以在MSDN中提供更好的示例。别忘了,必须编写主体代码才能在多个线程上运行,以及所有通常的线程安全注意事项,该框架尚未抽象该因素……。
打开App,查看更多内容
随时随地看视频慕课网APP