Ceph代码分析---线程池

时间:2021-02-27 12:36:45
对于计算密集型的业务通常使用线程池进行多线程并发处理,线程池在一定程度上可以有效的提高CPU的利用率,降低无用消耗。Ceph中实现了两种类型的线程池类(本质相同),并实现消息队列处理类。其中线程池类负责具体线程创建,维护和销毁。消息队列处理类则负责队列的管理,包括入队,出队等,消息队列类为一个模板类,保证其处理数据类型的通用性。
如图1所示为ThreadPool线程池类,该类中定义的成员变量_threads用于保持创建的线程,work_queues变量则保存了由该线程池中线程处理的消息队列。
线程池创建后可以创建指定数量(以参数而定)的线程,而线程会调用其工作函数进行具体的工作。在ThreadPool线程池中,线程的工作函数会调用线程池的worker成员函数进行具体的工作。
线程池的worker成员函数会遍历work_queues,从其中找出每一个消息队列实例,并调用该实例的函数遍历其中保存的消息,并进行消息的具体处理工作。
线程池可以对多种类型的消息队列进行处理,其实现方式是利用了面向对象多态的特性。线程池成员work_queues本身是一个消息队列超类,而具体使用时的消息队列都有各自的实现。

另外,为了保证消息队列的灵活性,消息队列超类的入队,出队和处理函数都实现为虚函数,保证具体的处理动作可以由子类实现。后续博文可以看到Ceph如何继承相应消息队列类,并进行具体工作的。

Ceph代码分析---线程池

图1

Ceph中实现的另一个线程池类是SharedThreadPool,该类的实现思路与ThreadPool类似。两者的不同之处在于对消息队列的处理方式。ThreadPool实现对多(种)队列的处理,并且其中的每种队列的处理方式可能不同。而SharedThreadPool则实现了一种多线程共享队列的处理方式,也即只有一个消息队列,多个线程同时对该队列进行处理。

Ceph代码分析---线程池

图2