gpt4 book ai didi

c++ - 为什么有些线程池实现不使用生产者和消费者模型

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:32 25 4
gpt4 key购买 nike

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

最佳答案

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

想想理想情况:所有 worker 总是很忙。当一个新任务入队时,您希望将其分派(dispatch)给将首先完成其当前/未决任务的工作人员。

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

另见: Is Work Stealing always the most appropriate user-level thread scheduling algorithm?

关于c++ - 为什么有些线程池实现不使用生产者和消费者模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com