1. Thread类说明
1. 功能
- muduo的线程类
2. 继承
- noncopyable
- muduo的类,声明为不可复制的,把赋值构造(重载=)和复制构造删除.
2. 成员变量说明
1.静态
- numCreated_
- AtomicInt32类型, 对整数的原子操作,详见第二篇
2. 其他
- started_
- bool类型,标识线程是否开始,若是start_为true就不能再调用start()
- joined_
- bool类型,看线程是否join
- pthreadId_
- 线程id
- tid_
- 进程id
- func_
- 线程函数
- name_
- 线程名字
- latch_
- 第六篇已经说过这个类的作用,就是等线程准备好后在执行
3. 成员函数说明
1. 非静态
- 构造函数
- 成员变量的初始化,重要的是线程函数和名字name
- 调用了setDefaultName(),numCreated_加1
- 析构函数
- 通过调用pthread_detach函数,子线程会和主线程分离,主线程不需要通过pthread_join函数进行回收
- 在线程start后,但没有调用join,就在析构函数中把子线程分离,这样应该是为了让线程执行完吧.
- start()
- 简单来说就是调用了pthread_create(),线程函数为detail::startThread,函数参数为detail::ThreadData类型,这两个下面有说
- join()
- 在线程启动并且没有join的时候,调用pthread_join()
- started()
- 返回start_,看线程是否启动
- tid()
- 返回线程tid_
- name()
- 返回线程名字
2. 静态
- numCreated()
- 返回numCreaded_的值,看一共创建了多少个线程
3. 私有
- setDefaultName()
- 在构造函数中调用,当name为空时设置名字为ThreadX
4. CurrentThread类的几个成员函数
- cacheTid()
- 缓存当前线程的进程id
- isMainThread()
- 看tid是否和进程id相同,即看是否是主线程
- sleepUsec(int64_t)
- 主要调用nanosleep(),
5. detail命名空间
1. 说明
- 在Thread.cc文件中,我觉得有3部分,一部分是detail命名空间里的内容,一部分是CurrentThread类的几个成员函数的实现,最后是Thread类的几个成员函数实现
- 后两者上面已经说了,下面说detail命名空间里的内容
2. 变量
- init
- ThreadNameInitializer类型对象,类说明见下
- 这是个全局变量,在程序一运行的时候就调用构造函数,初始化主线程信息…终于看懂了
3. 函数
- gettid()
- 调用系统调用SYS_gettid,获得进程id
- afterFork()
- 就是在fork后调用,初始化主线程信息…
- startThread(void*)
- 将参数转换为ThreadData类型,调用类对象的runInThread()函数,ThreadData类型说明见下
4. 类
1. ThreadNameInitializer
- 只有一个构造函数
- 主要就是创建主线程信息,调用afterFork,初始化t_cachedTid等信息
- pthread_atfork(void(*prepare)(void),void(*parent)(void),void(*child)(void)),在子进程创建前父进程调用prepare,子进程创建后父进程调用parent,子进程调用child
2. ThreadData
- 类功能如名字,线程数据
- 成员变量
- func_,线程函数
- name_,线程名字
- tid_,进程id
- latch_,
- 成员函数
- 构造函数,初始化几个变量,没啥说的
- runInThread(),总之就是初始化一些信息,调用func_()线程函数,处理异常.在这个函数中使用了latch_变量,作用就是等所有线程准备好后,latch_内的count_变量变为0,就通知所有线程可以执行了,默认为1的话,相当于不用等其他线程