4

我打算实现一个线程池来管理我项目中的线程。我想到的线程池的基本结构是队列,一些线程将任务生成到这个队列中,而一些由线程池管理的线程正在等待处理这些任务。我认为这是阶级生产者和消费者的问题。但是当我在网上google线程池实现时,我发现那些实现很少使用这个经典模型,所以我的问题是他们为什么不使用这个经典模型,这个模型有什么缺点吗?为什么他们不使用完整信号量和空信号量进行同步?

4

2 回答 2

9

如果您有多个线程在等待单个资源(在这种情况下是信号量和队列),那么您正在创建一个瓶颈。即使您有多个工作人员,您也会强制所有任务通过一个队列。从逻辑上讲,如果工作人员通常处于空闲状态,这可能是有道理的,但线程池的全部意义在于处理工作人员保持忙碌(以获得最大吞吐量)的重负载场景。在多处理器系统上使用单个输入队列将特别糟糕,因为所有工作人员在尝试获取下一个任务时都会读取和写入队列的头部。即使锁争用可能很低,队列头指针仍然需要在每次更新时从一个 CPU 缓存共享/通信到另一个。

想想理想的情况:所有的工人总是很忙。当新任务入队时,您希望将其分派给将首先完成其当前/待处理任务的工作人员。

如果作为客户端,您有一个无争用的预言机,它可以告诉您将新任务排入哪个工作人员,并且每个工作人员都有自己的队列,那么您可以使用自己的多写入器单读取器来实现每个工作程序队列并始终将新任务分派到最佳队列,从而消除单个共享输入队列上的工作争用。当然你没有这样的预言机,但是这种机制仍然可以很好地工作,直到工作人员用完任务或队列变得不平衡。“工作窃取”处理这些情况,同时与单队列情况相比仍然减少了争用。

另请参阅: Work Stealing 是否始终是最合适的用户级线程调度算法?

于 2013-08-12T03:53:24.770 回答
0

为什么没有生产者和消费者模型的实现

这个模型非常通用,可能有很多不同的解释,其中一个实现可能是Queue

尝试 Apache APR 队列:

它记录为Thread Safe FIFO bounded queue.

http://apr.apache.org/docs/apr-util/1.3/apr__queue_8h.html

于 2013-08-12T02:58:34.210 回答