【发布时间】:2010-09-07 11:59:23
【问题描述】:
我正在尝试为我的工作提出很多设计要求的线程池设计。这对于工作软件来说是一个真正的问题,而且是一项艰巨的任务。我有一个可行的实现,但我想把它扔给 SO,看看人们能想出什么有趣的想法,这样我就可以与我的实现进行比较,看看它是如何叠加的。我已经尽力满足要求。
线程池需要执行一系列任务。任务可以是短期运行(
任务优先级完全独立于任务长度。事实上,如果不运行一个任务,就无法判断它需要运行多长时间。
有些任务受 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();
};
}
【问题讨论】:
标签: c++ windows multithreading