[muduo网络库]——muduo库Thread类(剖析muduo网络库核心部分、设计思想)

接着之前我们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_postsem_wait函数配合使用来达到线程同步

sem_destroy(sem_t *sem)

用来释放信号量sem。

代码地址https://github.com/Cheeron955/mymuduo/tree/master

好了~ 关于muduo库的Thread类就剖析到这里,一定要注意one loop per thread。下一篇我们来剖析EventLoopThread类 ,里面还会提到Thread类~ 我们下一节见 ~~
相关推荐
lihao lihao1 分钟前
Linux信号
开发语言·c++·算法
Java患者·12 分钟前
《Python 人脸识别入门实践:从人脸检测到人脸比对完整实现》
开发语言·python·opencv·目标检测·计算机视觉·目标跟踪·视觉检测
ceclar12314 分钟前
C# 的任务并行库(TPL)
开发语言·c#·.net
大白话_NOI21 分钟前
【洛谷 P2249】查找(深基 13. 例 1)+ 详细分析
c++·算法
快乐的哈士奇23 分钟前
【Next.js实战①】Gmail API 按柜号检索邮件:OAuth 双 Cookie 与搜索 Fallback
开发语言·javascript·ecmascript
ElevenS_it18827 分钟前
Nginx日志监控告警实战:access_log解析+5xx突增+慢请求+异常IP自动告警完整方案(Filebeat+Zabbix)
运维·网络·tcp/ip·nginx·zabbix
weixin_3077791328 分钟前
Python写入Shell文件使用Linux系统的换行符
linux·开发语言·python·自动化
智者知已应修善业29 分钟前
【51单片机2个外部中断显示中断历时,初始化8左移3位共阳数码管】2024-6-6
c++·经验分享·笔记·算法·51单片机
zmzb01031 小时前
Python课后习题训练记录Day130
开发语言·python
码之气三段.1 小时前
edu158-B
c++