接着之前我们[muduo网络库]------muduo库TimeStamp类(剖析muduo网络库核心部分、设计思想),我们接下来继续看muduo库中的Thread类。
Thread类
thread类实现了对于线程的封装。
重要成员变量
powershell
bool started_; //线程是否启动
bool joined_; //是否被join回收
std::shared_ptr<std::thread> thread_; //用来管理生命周期
pid_t tid_; //线程ID
ThreadFunc func_; //线程函数
std::string name_; //线程名字
static std::atomic_int numCreated_; //本进程创建的线程数量
具体的解释见注释
重要成员函数
- 先是一些获取状态,线程ID,名字,线程数的函数
powershell
bool started() const { return started_; }
pid_t tid() const { return tid_; }
const std::string& name() const { return name_;}
static int numCreated() { return numCreated_;}
void Thread::setDefaultName() //初始化名字
{
int num = ++numCreated_;
if(name_.empty())
{
char buf[32] = {0};
snprintf(buf,sizeof buf,"Thread%d",num);
name_=buf;
}
}
- 启动线程
powershell
void Thread::start()
{
started_ = true;
sem_t sem;
sem_init(&sem,false,0);//初始值为0
thread_ = std::shared_ptr<std::thread>(new std::thread([&](){
//获取线程tid值
tid_ = CurrentThread::tid();
sem_post(&sem); //给信号量资源+1,说明tid_已经有了
//开始一个新线程,专门执行该线程函数
func_();
}));
//必须等待获取上面新线程的值线程tid_值
sem_wait(&sem); //阻塞住
}
注意 必须等待获取上面新线程tid_值,才能继续,one loop per thread
CurrentThread
我们在[muduo网络库]------muduo库三大核心组件之EventLoop类(剖析muduo网络库核心部分、设计思想)中介绍过来,如果想不起来大家移步去另一篇博客哦~
- 等待线程结束,清理线程资源
powershell
void Thread::join()
{
joined_= true;
thread_->join();
}
补充一下sem_t变量类型
sem_init()
extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。
sem_wait( sem_t *sem )
用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()
的非阻塞版本,它直接将信号量sem的值减一。
sem_post( sem_t *sem )
用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
sem_post
和sem_wait
函数配合使用来达到线程同步
sem_destroy(sem_t *sem)
用来释放信号量sem。
代码地址:https://github.com/Cheeron955/mymuduo/tree/master