给出以下代码:var arrayStrings = new string[1000];Parallel.ForEach<string>(arrayStrings, someString =>{ DoSomething(someString);});所有1000个线程会几乎同时生成吗?
3 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
在单核计算机上...集合的Parallel.ForEach分区(块)在多个线程之间工作,但是该数目是根据考虑了算法的算法计算出来的,并且似乎不断监视由线程执行的工作分配给ForEach的线程。因此,如果ForEach的主体部分调用长时间运行的IO绑定/阻塞函数,这会使线程处于等待状态,则该算法将产生更多线程并在它们之间重新分配集合。例如,如果线程快速完成并且不阻塞IO线程,例如仅计算一些数字,该算法将增加(或什至减少)线程数,使算法认为吞吐量最佳(每次迭代的平均完成时间)。
基本上,所有各种Parallel库函数后面的线程池都将确定要使用的最佳线程数。物理处理器内核的数量仅构成等式的一部分。内核数与产生的线程数之间没有简单的一对一关系。
我发现有关取消和处理同步线程的文档没有什么帮助。希望MS可以在MSDN中提供更好的示例。
别忘了,必须编写主体代码才能在多个线程上运行,以及所有通常的线程安全注意事项,该框架尚未抽象该因素……。
- 3 回答
- 0 关注
- 1754 浏览
添加回答
举报
0/150
提交
取消