.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/

 

posted @ 2019-04-04 16:08  caozhiyuan  阅读(479)  评论(0编辑  收藏  举报