c++线程池实现(一)半同步半异步线程池

为什么需要线程池

两个字——开销。
其实我们知道线程的创建会有一定的开销,操作系统需要分配给线程使用的堆栈的内存、列入调度等。当我们的项目中需要处理大量并发任务的时候,如果是每进来一个任务就创建一个线程去进行处理的话,创建和销毁线程就会比较消耗系统资源,并且不方便控制线程的数量。因此,我们可以一开始就创建一定数量的线程,当需要处理任务时,再分配一个线程去处理这个任务。任务处理完成之后,线程并不会销毁,会等待处理下一个任务,这样我们就可以有效的减少线程的频繁创建和销毁,节省资源,而且不同的cpu执行不同的线程,提供效率。同时每个线程都独立阻塞,避免主线程被阻塞。

线程池模式一般分为两种:半同步/半异步模式领导者与跟随者模式。本文主要介绍半同步/半异步模式。

半同步/半异步模式

也被称为生产者消费者模式。这个模式的线程池主要分为三层,分别是同步服务层、排队层和异步服务层。

同步服务层
同步服务层是第一层,主要是用来处理上层安排的任务。这些任务并不一定会被立刻执行,同步服务层会将任务传递给排队层。

排队层
排队层是中间层,可以理解为一个队列。它接受来自同步服务层的任务,再由异步服务层从中获取任务。这些任务的安排可能是并发,因此需要保证添加和获取任务都是线程安全的。

异步服务层
异步服务层是第三层,这里会有多个线程,它们会从排队层中获取任务执行。

从上面可以看到整个线程池的活动过程,线程池中包含了一开始就创建的一定数量的线程,它属于异步服务层,线程会从排队层中获取任务。如果现在排队层中没有任务,那么就会休眠等待,一旦排队层中添加进了新的任务,线程就会有被唤醒来处理任务。而同步层负责安排添加任务给排队层,这个任务添加可以是并发的,也可能是非常多的,因此排队层需要限制任务数量,避免队列过长,即当任务数量达到最大值时,就限制同步服务层把任务添加进队列,直到异步服务层取走任务,队列不满为止。

活动过程

下面图片展示了从线程池取出任务执行的活动:
c++线程池实现(一)半同步半异步线程池_第1张图片
下图图片展示了同步服务层往同步队列添加任务的活动过程:
c++线程池实现(一)半同步半异步线程池_第2张图片

总结

线程池的应用场景主要为下面:
.有大量任务需要并行执行的,并且每个任务比较简单、耗时较短。
.需要及时处理任务,快速返回结果。

下面将介绍同步队列(排队层)。

你可能感兴趣的:(编程,多线程,并发编程,c++)