1、EventLoopThread(IO线程类)
IO线程不一定是主线程
muduo并发模型one loop per thread + threadpool(计算线程池)
为了方便今后使用,定义了EventLoopThread类,该类封装了IO线程
EventLoopThread创建了一个线程在线程函数中创建了一个EvenLoop对象并调用EventLoop::loop
多个IO线程可以用IO线程池来管理,对应的类是EventLoopThreadPool
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
class EventLoopThread : boost::noncopyable
{ public: typedef boost::function< void(EventLoop *)> ThreadInitCallback; EventLoopThread( const ThreadInitCallback &cb = ThreadInitCallback()); ~EventLoopThread(); EventLoop *startLoop() // 启动线程,该线程就成为了IO线程 { thread_.start(); // 执行threadFunc(); 构造函数初始化列表中thread_(boost::bind(&EventLoopThread::threadFunc, this)) .... }; private: void threadFunc(); // 线程函数 EventLoop *loop_; // loop_指针指向一个EventLoop对象 bool exiting_; Thread thread_; MutexLock mutex_; Condition cond_; ThreadInitCallback callback_; // 回调函数在EventLoop::loop事件循环之前被调用 }; EventLoopThread::~EventLoopThread() { exiting_ = true; loop_->quit(); // 退出IO线程,让IO线程的loop循环退出,从而退出了IO线程 thread_.join(); }
C++ Code
{ EventLoop loop; if (callback_) { callback_(&loop); } { MutexLockGuard lock(mutex_); // 一般情况是EventLoopThread对象先析构,析构函数调用loop_->quit() 使得loop.loop() 退出循环 // 这样threadFunc 退出,loop栈上对象析构,loop_ 指针失效,但此时已经不会再通过loop_ 访问loop, // 故不会有问题。 loop_ = &loop; cond_.notify(); } loop.loop(); //assert(exiting_); } |
测试代码:
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |