.NET ThreadPool算法
.NET ThreadPool相关算法记录
1、ManagedThreadPool (corefx)
.net4.0之前只有全局队列,为了解决全局队列多线程竞争使用问题,引入work-stealing算法(golang scheduler也是这个算法)。
内部是通过ThreadLocal WorkStealingQueue实现。详细说明:(http://www.danielmoth.com/Blog/New-And-Improved-CLR-4-Thread-Pool-Engine.aspx)
2、CLRThreadPool (coreclr)
CLRThreadPool爬山算法( https://github.com/mattwarren/HillClimbingClrThreadPool )实现了使用最少线程到达最大吞吐量的目标
.NET线程池自动管理池中的工作线程数。它根据内置启发式新增和减少线程。
NET线程池有两种主要的注入线程机制:
饥饿避免机制(如果它看到没有在排队项目上取得进展,则添加工作线程)
爬山试探(试图在使用尽可能少的线程时最大化吞吐量)
爬山启发式的一个目标是在线程被I/O或其他停止处理器的等待条件阻塞时提高核心的利用率。
.NET线程池有机会在每次工作项完成时或以500毫秒的间隔注入线程,以较短者为准。
由线程计数中先前更改的反馈引导,线程池尝试添加线程(或将它们带走),
如果添加线程似乎有助于吞吐量,则线程池会增加更多;否则,它会减少工作线程的数量。这种技术被称为爬山启发式。
扩展阅读:
Go's work-stealing scheduler:https://rakyll.org/scheduler/