ceph源码分析之线程介绍

本文深入探讨Ceph分布式存储系统的源码,重点分析其多线程实现。Ceph中的线程主要分为四类:普通类线程、SafeTimerThread、FinisherThread和ThreadPool内部线程。每个类别都有其特定的使用场景和功能,例如SafeTimerThread用于定时任务,FinisherThread在特定操作完成后执行回调,ThreadPool则提供了线程池的工作模式。通过对Ceph源码的学习,可以提升C++多线程编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ceph是一款优秀的分布式存储软件,通过学习它的源码,我们可以学到很多编程技巧,ceph中关于多线程的编程,是一个很好的学习对象。

Ceph中线程的在src/common/Thread.h中定义

class Thread {
 private:
  pthread_t thread_id;
 public:
  Thread(const Thread& other);
  const Thread& operator=(const Thread& other);
  Thread();
  virtual ~Thread();
 protected:
  virtual void *entry() = 0;//子类需要实现此函数,作为线程入口
 private:
  static void *_entry_func(void *arg);
 public:
  const pthread_t &get_thread_id();
  bool is_started();
  bool am_self();
  int kill(int signal);//杀掉自己
  int try_create(size_t stacksize);
  void create(size_t stacksize = 0);//创建线程,里面传入了entry函数
  int join(void **prval = 0);//阻塞自己等待线程结束,回收资源
  int detach();//父子线程分离
};

C开发者都知道线程编程接口,一个线程在创建时调用pthread_create函数来传入entry函数,杀死线程调用pthread_kill函数,当线程被杀死之后,必须调用pthread_join函数来进行线程资源的回收,如果不调用此函数,就会出现类似zombie process。如果要想让系统自己回收线程资源,就要将线程与父线程分离即调用pthread_detach.通过接口对比,我们发现src/common/Thread.h中定义的class thread,实际上是对线程代码ceph自己实现的一层封装。


Ceph中所有要用的线程必须继承Thread类,通过查找发现如下一些线程:

Accepter.h (src\msg):class Accepter : public Thread     //用来socket bind的线程,      accepter线程入口函数里定义了poll的网络通讯结构,用来放入管道
Admin_socket.h (src\common):class AdminSocket : public Thread
Ceph_context.cc (src\common):class CephContextServiceThread : public Thread
DispatchQueue.h (src\msg):  class DispatchThread : public Thread   //用来进行消息分发的线程,  在simpleMessenger中有dispatch_queue成员变量,
FileJournal.h (src\os):  class Writer : public Thread     //用来进行写数据到journal中的线程
FileJournal.h (src\os):  class WriteFinisher : public Thread   //当用aio异步模式写数据到journal完成后,此线程用来接管其他剩余操作
FileStore.h (src\os):  struct SyncThread : public Thread    //用来同步数据执行同步的线程,主要是将已经完成的journal的序列号写入到文件中
Finisher.h (src\common):  struct 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值