当前位置: 首页 > news >正文

moduo之线程Thread

简介

moduo中的线程不是像ACE,asio抽象出线程适配器基类,而是直接使用特定的线程数据ThreadData

线程

Thread
ThreadData

Thread

线程成员有

bool       started_;  //线程启动状态
bool       joined_;//是否调用join
pthread_t  pthreadId_;//线程id
pid_t      tid_;//线程id
ThreadFunc func_;//线程处理函数
string     name_;//线程名,没有指定时,默认是Thread+线程创建的个数
CountDownLatch latch_;//线程启动时,等待线程起来static AtomicInt32 numCreated_;//线程总个数

构造函数,latch_初始为1,设置默认线程名


Thread::Thread(ThreadFunc func, const string& n): started_(false),joined_(false),pthreadId_(0),tid_(0),func_(std::move(func)),name_(n),latch_(1)
{setDefaultName();
}void Thread::setDefaultName()
{int num = numCreated_.incrementAndGet();if (name_.empty()){char buf[32];snprintf(buf, sizeof buf, "Thread%d", num);name_ = buf;}
}

线程启动,设置started_ 为true,创建ThreadData数据,将线程执行函数func_,线程名name_,线程id引用tid_,线程同步latch_传给ThreadData,传给linux线程创建函数,线程启动函数为startThread,内部执行ThreadData的runInThread方法

void Thread::start()
{assert(!started_);started_ = true;// FIXME: move(func_)detail::ThreadData* data = new detail::ThreadData(func_, name_, &tid_, &latch_);if (pthread_create(&pthreadId_, NULL, &detail::startThread, data)){started_ = false;delete data; // or no delete?LOG_SYSFATAL << "Failed in pthread_create";}else{latch_.wait();assert(tid_ > 0);}
}void* startThread(void* obj)
{ThreadData* data = static_cast<ThreadData*>(obj);data->runInThread();delete data;return NULL;
}void runInThread(){*tid_ = muduo::CurrentThread::tid();tid_ = NULL;latch_->countDown();latch_ = NULL;muduo::CurrentThread::t_threadName = name_.empty() ? "muduoThread" : name_.c_str();::prctl(PR_SET_NAME, muduo::CurrentThread::t_threadName);try{func_();muduo::CurrentThread::t_threadName = "finished";}catch (const Exception& ex){muduo::CurrentThread::t_threadName = "crashed";fprintf(stderr, "exception caught in Thread %s\n", name_.c_str());fprintf(stderr, "reason: %s\n", ex.what());fprintf(stderr, "stack trace: %s\n", ex.stackTrace());abort();}catch (const std::exception& ex){muduo::CurrentThread::t_threadName = "crashed";fprintf(stderr, "exception caught in Thread %s\n", name_.c_str());fprintf(stderr, "reason: %s\n", ex.what());abort();}catch (...){muduo::CurrentThread::t_threadName = "crashed";fprintf(stderr, "unknown exception caught in Thread %s\n", name_.c_str());throw; // rethrow}}

ThreadData

线程数据,其成员有

  typedef muduo::Thread::ThreadFunc ThreadFunc;ThreadFunc func_;//线程处理函数string name_;//线程名pid_t* tid_;//线路idCountDownLatch* latch_;//同步调用线程和新建线程

构造函数

  ThreadData(ThreadFunc func,const string& name,pid_t* tid,CountDownLatch* latch): func_(std::move(func)),name_(name),tid_(tid),latch_(latch){ }

执行线程函数,设置线程tid_,同步计数减1,唤醒调用线程,设置当前线程名

void runInThread(){*tid_ = muduo::CurrentThread::tid();tid_ = NULL;latch_->countDown();latch_ = NULL;muduo::CurrentThread::t_threadName = name_.empty() ? "muduoThread" : name_.c_str();::prctl(PR_SET_NAME, muduo::CurrentThread::t_threadName);try{func_();muduo::CurrentThread::t_threadName = "finished";}catch (const Exception& ex){muduo::CurrentThread::t_threadName = "crashed";fprintf(stderr, "exception caught in Thread %s\n", name_.c_str());fprintf(stderr, "reason: %s\n", ex.what());fprintf(stderr, "stack trace: %s\n", ex.stackTrace());abort();}catch (const std::exception& ex){muduo::CurrentThread::t_threadName = "crashed";fprintf(stderr, "exception caught in Thread %s\n", name_.c_str());fprintf(stderr, "reason: %s\n", ex.what());abort();}catch (...){muduo::CurrentThread::t_threadName = "crashed";fprintf(stderr, "unknown exception caught in Thread %s\n", name_.c_str());throw; // rethrow}}

相关文章:

  • 为什么会出现 make 工程管理器?它到底能做什么?
  • [Linux_core] “虚拟文件” | procfs | devfs | 上下文
  • 前端大文件分片上传+后端(node)接收分片并合并
  • Android 网络请求的选择逻辑(Connectivity Modules)
  • 深入解析 MySQL 并发控制:读写锁、锁粒度与高级优化
  • 数据库(考前两天版本)
  • 李沐动手深度学习(pycharm中运行笔记)——11.模型选择+过拟合欠拟合
  • SQL关键字三分钟入门:UNION 与 UNION ALL —— 数据合并全攻略
  • RKNN开发环境搭建3-RKNN Model Zoo 板载部署以Whisper为例
  • pyqt 简单条码系统
  • OpenStack入门
  • 搭建简易采购系统:从需求分析到供应商数据库设计
  • 【第二章:机器学习与神经网络概述】01.聚类算法理论与实践-(2)层次聚类算法(Hierarchical Clustering)
  • 【对比】DeepAR 和 N-Beats
  • 【unitrix】 3.0 基本结构体(types.rs)
  • python 解码 jwt
  • javaweb -Ajax
  • LVS—DR模式
  • 最新FVCOM 潮流、波浪、泥沙、水质、温盐、染色剂、粒子示踪、嵌套、背景流、自动化全流程
  • 在线教育平台敏捷开发项目
  • 淘客网站建设要求/上海百度提升优化
  • 公司网站建设开源平台/电商运营工作内容
  • 深圳沙井做网站/网络营销个人感悟小结
  • 公司网站设计欣赏/安徽seo报价
  • 网站是由哪些组成/营销策略分析论文
  • 专业做包包的网站/北京优化网站公司