muduo库阅读(35)——Net部分:用于执行事件循环(EventLoop)的线程类EventLoopThread
2015-11-11 21:36
369 查看
这个类专门创建一个线程用于执行Reactor的事件循环
当然这只是一个辅助类,没有说一定要使用它,可以根据自己的情况进行选择
你也可以不创建线程去执行事件循环,而在主线程中执行事件循环,一切根据自己的需要
当然这只是一个辅助类,没有说一定要使用它,可以根据自己的情况进行选择
你也可以不创建线程去执行事件循环,而在主线程中执行事件循环,一切根据自己的需要
/* * 用于执行Reactor(EventLoop)循环的线程 */ namespace muduo { namespace net { class EventLoop; class EventLoopThread : boost::noncopyable { public: // 线程初始化回调函数 typedef boost::function<void(EventLoop*)> ThreadInitCallback; EventLoopThread(const ThreadInitCallback& cb = ThreadInitCallback(), const string& name = string()); ~EventLoopThread(); // 启动循环 EventLoop* startLoop(); private: // 线程函数用于执行EventLoop的循环 void threadFunc(); // 对应的Reactor EventLoop* loop_; // 是否正在退出 bool exiting_; // 执行Reactor循环的线程 Thread thread_; // 锁,条件变量的锁 MutexLock mutex_; // 条件变量,用于exiting_变化的通知 Condition cond_; // 线程初始化回调函数 ThreadInitCallback callback_; }; } }
using namespace muduo; using namespace muduo::net; /* * 构造函数 */ EventLoopThread::EventLoopThread(const ThreadInitCallback& cb, const string& name) : loop_(NULL), exiting_(false), thread_(boost::bind(&EventLoopThread::threadFunc, this), name), mutex_(), cond_(mutex_), callback_(cb) { } /* * 析构函数 */ EventLoopThread::~EventLoopThread() { exiting_ = true; if (loop_ != NULL) // not 100% race-free, eg. threadFunc could be running callback_. { // still a tiny chance to call destructed object, if threadFunc exits just now. // but when EventLoopThread destructs, usually programming is exiting anyway. // 退出循环 loop_->quit(); // 等待线程结束 thread_.join(); } } // 开始循环 EventLoop* EventLoopThread::startLoop() { assert(!thread_.started()); // 启动线程 thread_.start(); { // 等待线程启动完毕 MutexLockGuard lock(mutex_); while (loop_ == NULL) { cond_.wait(); } } return loop_; } // 线程函数:用于执行EVentLoop的循环 void EventLoopThread::threadFunc() { EventLoop loop; // 如果有初始化函数,就先调用初始化函数 if (callback_) { callback_(&loop); } { MutexLockGuard lock(mutex_); loop_ = &loop; // 通知startLoop线程已经启动完毕 cond_.notify(); } // 事件循环 loop.loop(); loop_ = NULL; }
相关文章推荐
- CentOS6.5 heartbeat高可用集群的详解及工作流程
- 遥感影像序列生成视频
- Top 和 LIMIT
- Linux终端bash美化教程
- VS2013+opencv2.4.11
- 学习Opencv的小心得
- 每天一个linux命令(53):route命令
- 适用于Ubuntu的最新版Nginx源整理
- CentOS下的C连接MySQL数据库
- Linux安装软件包过慢怎么办?
- zabbix 添加对网卡流量超出阈值的监控
- 朋友介绍的一个购物网站,非常好!!!
- Linux---Ubuntu系统安装(使用技巧)
- Nginx 中last和break 及 permanent 和 redirect 的爱恨情仇
- linux下core文件调试方法
- Linux多线程实践(9) --简单线程池的设计与实现
- Could not publish server configuration for Tomcat v6.0 Server at localhost.
- nginx进程模型
- Apache Pig 安装配置
- ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Encountered IOException. File or directory null