我正在阅读Essential C# 5.0,上面写着,
线程池还假设所有工作都是相对的 短时间运行(即消耗几毫秒或几秒的处理器 时间,而不是几小时或几天)。通过做出这个假设,它可以确保 每个处理器都在完成任务,而则没有 切换多个任务的时间效率低下。线程池尝试 通过确保创建线程来防止过多的时间切片 "节流"因此,没有任何一个处理器是超额订阅的"也是 很多线程。
我一直认为多线程的好处之一就是时间切片。
如果你> 1个处理器,那么你可以同时运行线程并实现真正的多线程。但除非是这种情况,否则你不得不为具有多个线程的应用程序采用时间切片吗?
因此,如果C#中的ThreadPool没有时间片,那么,
一个。是否意味着ThreadPool 仅用于绕过创建新线程的开销?
湾这是否意味着ThreadPool不能同时运行多个线程,除非处理器有多个内核,每个内核可以运行一个进程?
答案 0 :(得分:3)
.NET线程池将为每个核心创建多个线程,但具有启发式,可以在执行最大工作量时保持线程数尽可能低。
这意味着如果您的代码受CPU限制,则每个核心最终可能会有一个线程。如果您的代码受I / O约束并阻塞或排队大量工作项,那么每个核心可能会有很多线程。
这不仅仅是创建昂贵的线程:在数百个线程之间进行上下文切换需要花费大量时间,而不是花费在运行自己的代码上。更多线程几乎永远不会更好。
答案 1 :(得分:2)
您提到的引用是指Threadpool在已创建的所有线程已分配给任务时创建新线程的速率。新线程创建速率受到限制(新任务排队),以避免在Threadpool上放置大量任务时创建许多线程(并淹没CPU)。
当前的算法确实为每个CPU核心创建了许多线程,但它创建它们的速度相对较慢,希望当前积压的任务能够通过它已经创建的线程快速满足,并且添加线程将不会需要的。
答案 2 :(得分:0)
Q值。这是否意味着ThreadPool仅用于绕过创建新线程的开销?
一个。不。线程创建通常不是问题。目标是使您的CPU工作在100%,同时尽可能少地同时执行线程。较少的线程数将避免过多的上下文切换,并改善总体执行时间。
Q值。这是否意味着ThreadPool不能同时运行多个线程,除非处理器有多个内核,每个内核可以运行一个进程?
一个。它同时运行多个线程。理想情况下,它每个核心只运行一个CPU密集型任务,在这种情况下,CPU工作在100%