为什么线程池以这种方式管理线程?

时间:2014-12-03 06:03:58

标签: c# .net multithreading algorithm threadpool

Joe Albahari在他的C#电子书中的线程中提供了great explanation .NET Thread Pool的自动线程管理,以及它的工作原理。

根据我的理解,默认情况下,在占用所有处理器核心后,线程池会延迟新线程的创建,因为如果所有处理器核心都在忙于进行计算,那么创建新线程将无法再提高整体吞吐量(应用程序每秒完成的任务,新线程只是浪费系统资源。

但是,如果任务在线程池队列中停留的时间过长,则线程池会假定池化线程以某种方式空闲或阻塞,并尝试通过同时运行任务来利用停机时间。

在许多情况下,使用一种技术可以使线程池线程具有发出“等待”状态信号的特殊属性,而不是这种“延迟”算法。它可能看起来像这样:

System.Threading.Thread.CurrentThread.IsWaiting = true;

线程池将立即为排队任务创建新线程,直到所有处理器核心都被非等待线程占用。然后,任务保留在队列中,直到线程结束,或发出等待状态信号。

这会带来一些好处。首先,如果处理器核心处于空闲状态,则任务总是在它们排队到池中的瞬间启动,没有延迟。其次,在运行大量耗时超过半秒的计算密集型任务的应用程序中,线程池不会继续给系统带来不必要的额外线程负担。

当然,在某些情况下,应用程序需要在严格的期限内完成任务,并且不能等待其他任务先完成。此算法可能不适用于那些应用程序。否则,我认为它只会提高多线程应用程序的效率。

您怎么看?

1 个答案:

答案 0 :(得分:0)

我们在Thread.ThreadState属性中提供了此信息。但是线程池使用这些信息不是一个好主意。要使用它,我们需要线程之间的通信(线程池中的那些,以及收集信息的另一个)。这意味着需要同步,或至少是易失性访问。两者都非常昂贵。因此,我们会给ThreadPool的所有应用程序带来运行时负担,而只有少数会受益。

作为程序员,您必须反映您的线程池的使用方式。如果标准行为不适合您,您可以调整池。例如。使用ThreadPool.SetMinThreads,如果你知道你有很多等待线程。它不会像你想的那样自动化。但是你的自动化也不是很完美,因为当一些等待线程同时唤醒时,我们可以轻松运行太多线程。

注意,其他线程池根本没有非常聪明的扩展heurisitc,它构建在C#变体中。通常,您有一定数量的正在运行的线程,并且您将永远不会运行此数字。