我正在尝试为我的工作提出很多设计要求的线程池设计。这对于工作软件来说是一个真正的问题,而且是一项艰巨的任务。我有一个可行的实现,但我想把它扔给 SO,看看人们能想出什么有趣的想法,这样我就可以与我的实现进行比较,看看它是如何叠加的。我试图尽可能具体地满足要求。
线程池需要执行一系列任务。任务可以是短期运行(<1 秒)或长期运行(数小时或数天)。每个任务都有一个关联的优先级(从 1 = 非常低到 5 = 非常高)。任务可以在其他任务运行时随时到达,因此当它们到达时,线程池需要在线程可用时拾取它们并安排它们。
任务优先级完全独立于任务长度。事实上,如果不运行一个任务,就不可能知道它需要多长时间才能运行。
有些任务受 CPU 限制,而有些任务受 IO 限制。不可能事先知道给定的任务是什么(尽管我猜可能在任务运行时检测到)。
线程池的主要目标是最大化吞吐量。线程池应该有效地使用计算机的资源。理想情况下,对于 CPU 密集型任务,活动线程的数量将等于 CPU 的数量。对于 IO 绑定任务,应分配比 CPU 更多的线程,以便阻塞不会过度影响吞吐量。尽量减少锁的使用和使用线程安全/快速容器很重要。
通常,您应该以更高的 CPU 优先级运行更高优先级的任务(参考:SetThreadPriority)。较低优先级的任务不应“阻止”较高优先级的任务运行,因此如果在所有低优先级任务都在运行时出现较高优先级的任务,则较高优先级的任务将开始运行。
这些任务有一个与之关联的“最大运行任务”参数。每种类型的任务一次最多只能运行该任务的这么多并发实例。例如,我们可能在队列中有以下任务:
- A - 1000 个实例 - 低优先级 - 最大任务 1
- B - 1000 个实例 - 低优先级 - 最大任务 1
- C - 1000 个实例 - 低优先级 - 最大任务 1
一个工作实现只能(最多)同时运行 1 A、1 B 和 1 C。
它需要在 Windows XP、Server 2003、Vista 和 Server 2008(最新的服务包)上运行。
作为参考,我们可以使用以下接口:
namespace ThreadPool
{
class Task
{
public:
Task();
void run();
};
class ThreadPool
{
public:
ThreadPool();
~ThreadPool();
void run(Task *inst);
void stop();
};
}