2011-02-07 78 views
3

您认为线程池设计模式是多核未来的方式吗?线程池和多核系统

甲threadpooling文库,例如,如果广泛使用,使得/强制应用程序写入器

(1)〜把问题分解成单独的并行作业因此促进(实施:))并行

(2)通过从所有低级操作系统调用中抽象出来,同步等等,使程序员的生活更轻松。 (特别是C程序员:))

我都坚信它的最佳方式(或一个“最佳”的方式:))针对多核的未来......

所以,我的问题是,我是写这样想的还是我在一些错觉:)

问候,

微内核

+0

这个问题有点不清楚。关于SO的指导原则是每个问题应该有一个明确的正确答案(一旦发现,如果有的话)。我建议制作这个社区维基,因为这是一个有趣的话题,但如同一个问题一样,它是一个讨论话题。 – 2011-02-07 18:03:33

回答

6

线程池是一个涉及到一个队列,并以多个线程的技术,其他任务来自队列中的作业并处理它们。这与每当新任务到达时才开始新线程的技术形成对比。

好处是,线程的最大数量是有限的避免太多线程,并且有任何新的任务涉及较少的开销(线程已经运行,并采取任务。启动无需威胁)。

这是否是一个好的设计高度取决于你的问题。如果你有很多短期工作以非常快的速度进入你的程序,那么这是一个好主意,因为较低的开销是一个好处。如果你有大量的并发任务,这是一个好主意,让你的调度程序不必做太多的工作。

有很多地方线程池是没有用的。所以你不能一概而论。有时多线程是不可能的。或者甚至不需要,因为多线程会在您的代码中添加一个难以预测的元素(竞争条件),这是非常难以调试的。

线程池库很难“强制”使用它。你仍然需要思考的东西,如果你只是开始一个线程...不会帮助。

1

对于Windows NT引擎线程池通常远比I/O完成端口效率低。这些在许多问题和答案中都有广泛的介绍。 IOCP支持事件驱动处理,因为多个线程可以等待IOCP,直到由于套接字或处理器上的IOC(读取或写入)而发生事件,然后排队等待IOCP。 IOCP依次将等待的线程与事件的ID进行配对,并释放该线程进行处理。在线程处理了事件并启动了一个新的I/O之后,它返回到IOCP等待下一个事件(这可能是也可能不是它刚刚启动的I/O的完成)。

国际石油公司也可能通过从非事件明确发布人为地发出信号。

使用IOCP不是轮询。最佳的IOCP实现将具有等待IOCP的线程数量,因为系统中有内核。如果线程被认为是有效的,那么所有线程都可以执行相同的物理代码由于一个线程从一个IOC处理直到它发出一个I/O,它不会强制它等待其他资源,除了可能竞争访问线程安全区域。摆脱“每个线程一个句柄”范例是自然选择。因此IOCP控制的线程与程序员能够构建它们一样高效。

0

我非常喜欢@yaankee的答案,除了我会争辩说线程池几乎总是正确的路要走。原因是:线程池可以退化为一个简单的静态工作分区模型,用于矩阵 - 矩阵乘法等问题。 OpenMP引导就是这样。