0
当线程在提交给线程池的任务之间切换时,是否会产生上下文切换开销(或类似情况)?线程池是否会产生上下文切换开销?
当线程在提交给线程池的任务之间切换时,是否会产生上下文切换开销(或类似情况)?线程池是否会产生上下文切换开销?
编号上下文切换是存储和恢复线程状态的过程。当你的CPU支持更多线程时,这一点很重要。这样你的操作系统就可以在少量的物理线程上模拟许多线程。简单地说就是more threads == more overhead
,因为上下文切换必须更频繁地发生(所以我们仍然会并行地发生错觉)。直到它崩溃你的系统。 :)
但是,当线程在任务之间切换时,这些任务必须存储在某个地方。这通常由一个队列完成。所以从线程的角度来看,这只是queue.pop()
并继续处理。
现在无论执行什么队列,都必须有一致性和原子性保证.pop()
操作。这样的保证总是伴随着一个小的(或者很大的,依赖于实现的)开销。
所以是的,任务之间的切换会带来性能问题,但这与上下文切换无关。
我明白了。感谢您的澄清。因此,如果我设置了大小为50的线程池,并且只有4个物理线程可用,那么在50个右侧之间仍然会有一些上下文切换? – frodo
@frodo是的,当然。但是你应该对'50'很好,这个数字很小,开销应该很小。 – freakish
好的很酷。我想我正在寻找关于如何选择线程池大小的指南。 – frodo