我一直在阅读有关多线程编程和最佳线程数的信息。我理解这是非常主观的,因具体情况而异,只有通过反复试验才能找到真正的最优。
但是,我发现这么多帖子说如果任务是非I / O绑定,那么
Optimal: numberOf(threads) ~= numberOf(cores)
请查看Optimal number of threads per core
Q)如果数百/数千个背景(操作系统/其他东西)线程已经在争取轮到他们,那么上述等式如何才能生效?
Q)没有更多的线程会增加分配核心的可能性吗?
答案 0 :(得分:5)
"最佳"仅适用于执行全油门的线程。您可以在Windows任务管理器中看到的1000多个线程是未执行的线程。他们正在等待通知,阻止同步对象的wait()调用。
哪个包含 I / O,但也可以是计时器,驱动程序事件,进程互操作同步对象,等待消息的UI线程等。后者更不可见,因为它们通常由友好的api包裹。
编写一个程序,其中包含与机器一样多的线程,并且所有内容都是100%核心,实际上并不常见。您必须解决需要纯计算的问题。实际程序通常由于需要读取/写入数据以执行操作而受到阻碍,或者受到数据到达速率的限制。
如果线程刻录100%核心,则超额处理处理器不是一个好策略。他们开始互相争斗,上下文切换开销导致 less 工作完成。他们阻止时很好。阻止会自动使核心可用于执行其他操作。