当存在数千个后台线程时,为什么程序的最佳线程数与核心数相关

pha*_*ani 2 parallel-processing cpu performance multithreading

我一直在阅读有关多线程编程和最佳线程数的信息.我理解这是非常主观的,因具体情况而异,只有通过反复试验才能找到真正的最优.

但是,我发现很多帖子说如果任务不是I/O限制的话,那么

Optimal: numberOf(threads) ~= numberOf(cores)
Run Code Online (Sandbox Code Playgroud)

请查看每个核心的最佳线程数

问)如果数百/数千个背景(操作系统/其他东西)线程已经在争取轮到他们,那么上述方程如何有效?

问)没有更多的线程数会增加被分配核心的可能性吗?

Han*_*ant 5

"最佳"仅适用于执行全油门的线程.您可以在Windows任务管理器中看到的1000多个线程是未执行的线程.他们正在等待通知,阻止同步对象的wait()调用.

其中包括 I/O,但也可以是计时器,驱动程序事件,进程互操作同步对象,等待消息的UI线程等.后者更不可见,因为它们通常由友好的api包裹.

编写一个程序,其中包含与机器一样多的线程,并且所有刻录100%核心的程序实际上并不常见.您必须解决需要纯计算的问题.实际程序通常由于需要读取/写入数据以执行操作而受到阻碍,或者受到数据到达速率的限制.

如果你有100%核心的线程,那么过度调度处理器并不是一个好策略.他们将开始互相争斗,上下文切换开销导致更少的工作要做.他们阻止时很好.阻止自动使核心可用于执行其他操作.