muduo::Thread类分析
来源:互联网 发布:速拓软件好用吗 编辑:程序博客网 时间:2024/05/22 13:05
在看源代码前,先学习一个关键字:__thread。
线程共享进程的数据,如果想要每个线程都有一份独立的数据,那么可以使用__thread关键字修饰数据。 __thread只能用于修饰POD类型的数据,不能修饰class,因为它无法调用构造函数和析构函数。__thread可以修饰全局变量、函数内的静态变量,不能修饰函数内的局部变量或class的普通成员变量。
在muduo/base/thread.{h, cc}中实现了线程的封装。thread的封装和一个命名空间muduo::CurrentThread紧密相关,在这个空间中定义了和线程相关的属性,这些属性如下:
extern __thread int t_cachedTid; extern __thread char t_tidString[32]; extern __thread int t_tidStringLength; extern __thread const char* t_threadName;
t_cachedTid表示线程的真实id。 POSIX的thread库提供了pthread_self获取当前线程的标识符,类型为pthread_t,这是一个结构体,用起来不便。线程的真实id是一个整数,可以通过系统调用syscall(SYS_gettid)获得,在muduo中封装为gettid()函数。调用系统调用开销比较大,因此可以使用一个变量t_cachedTid来存储,在线程第一次使用tid时通过系统调用获得,存储在t_cacheTid中,以后使用时不再需要系统调用了。
t_tidString[32] 用string类型表示tid,便于输出日志。
t_tidStringLength string类型tid的长度。
t_threadName 线程的名字。
命名空间muduo::CurrentThread还声明了一些函数,用来获取上述线程的属性,这些函数在thread.cc中实现。
thread类的类图如下:
ThreadFunc类型为:
typedef boost::function<void ()> ThreadFunc;
即为线程执行的函数对象。
numCreated_是一个静态变量,类型为AtomicInt32(定义在Atomic.h),用来表示第几次创建线程实例,在记录日志时可以记录为:线程名+numCreated_ 。
析构函数如下:
Thread::~Thread(){ if (started_ && !joined_) { pthread_detach(pthreadId_); }}
可以看出没有在析构函数join,即thread的析构不会等待线程的结束。如果thread对象的生命周期长于线程,那么可以通过Thread::join等待线程结束,否则析构时会自动detach线程,避免资源泄露。
其他成员变量很容易从名字看出其意义。
在类thread的实现(thread.cc)中还用到了两个数据结构,一个为ThreadData,用来辅助调用线程执行的函数。另一个为ThreadNameInitializer,为了给线程创建做准备,这个类有个全局实例,会先调用它的构造函数,在构造函数中给线程的创建做好环境准备。其中用到了pthread_atfork(NULL, NULL, &afterFork)。这个函数原型如下:
#include <pthread.h>int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
这是一个跟进程创建有关的函数,为fork的调用做准备和调用后子进程父进程的初始化。prepare函数在调用fork前执行,parent在调用fork后的父进程中执行,child在调用fork后的子进程中执行。这是假设了当前线程的主线程是由另一个进程创建的。
在实际应用中,多线程时不要调用fork,否则容易出现一些问题。因为fork只能克隆当前线程,却会复制当前进程的所有资源以及其状态,如果复制了一个lock的mutex,却没有复制unlock的线程,那么在给mutex加锁时就会出现死锁。唯一安全的做法是fork后马上调用exec函数。
- muduo::Thread类分析
- muduo源码分析:线程类Thread封装
- muduo分析之Thread类封装
- muduo库Thread类剖析
- muduo : Thread
- muduo源码分析---EventLoop类
- muduo源码分析--EventLoopThreadPool类
- muduo源码分析:ThreadLocalSigleton类
- muduo : Thread-safe Singleton
- muduo网络库学习笔记(3):Thread类
- muduo源码分析--EventLoop 类的实现
- muduo源码分析:异常类封装
- muduo源码分析:线程池类ThreadPool
- muduo源码分析(1):时间类
- [Muduo网络库源码分析] (9) base/Thread.cc_h_CurrentThread_h线程对象
- muduo源码分析--详解muduo多线程模型
- muduo源码分析---EventLoopThread
- muduo源码分析--TcpServer
- eclipse构建HBase开发环境并运行实例对Hbase建表增删改查
- C中#ifdef、#endif、+1、#if defined
- 关于隐式Intent的理解
- POJ 2777 Count Color
- 容易混淆的数据库单引号和双引号
- muduo::Thread类分析
- zoj1048
- Python - 字典按值(value)排序
- groovy : 随机数
- zoj1051
- MATLAB神经网络工具箱函数
- zoj1067
- zoj1115
- 深入浅出java静态代理和动态代理