一、LoopThread模块
目标:将eventloop模块和线程整合起来!
eventloop 和 线程是一一对应的!
eventloop 模块实例化的对象,在构造的时候就会吃实话! _thread_id;
而后面当运行一个操作的时候判断是否运行在eventloop所对应的线程中,就是将线程ID与EventLoop模块中的thread_id 进行一个比较,相同就表示在同一个线程,不同就表示当前运行线程并不是eventloop线程!
eventloop 模块在实例化对象的时候,必须在线程内部!
eventloop 实例化对象会设置自己的 thread_id;
如果我们先创建了多个 eventloop 对象,然后创建了多个线程,将各自的线程id,重新给 eventloop 进行设置!
存在问题:在构造 eventloop对象,到设置新的 thread_id 期间将是不可控的!
因此,必须先创建线程,然后在线程的入口函数中,去实例化 eventloop 对象!
构造一个新的模块:LoopThread
二、实现思想
(一)功能
进行整合,可以向外部返回实例化的eventloop。
(二)意义
将eventloop模块和线程整合起来!
(三)功能设计
- 创建线程
- 在线程中实例化 eventloop 对象
功能:可以向外部返回实例化的eventloop。
三、代码
class LoopThread {
private:
/*用于实现_loop获取的同步关系,避免线程创建了,但是_loop还没有实例化之前去获取_loop*/
std::mutex _mutex; // 互斥锁
std::condition_variable _cond; // 条件变量
EventLoop *_loop; // EventLoop指针变量,这个对象需要在线程内实例化
std::thread _thread; // EventLoop对应的线程
private:
/*实例化 EventLoop 对象,唤醒_cond上有可能阻塞的线程,并且开始运行EventLoop模块的功能*/
void ThreadEntry() {
EventLoop loop;
{
std::unique_lock<std::mutex> lock(_mutex);//加锁
_loop = &loop;
_cond.notify_all();
}
loop.Start();
}
public:
/*创建线程,设定线程入口函数*/
LoopThread():_loop(NULL), _thread(std::thread(&LoopThread::ThreadEntry, this)) {}
/*返回当前线程关联的EventLoop对象指针*/
EventLoop *GetLoop() {
EventLoop *loop = NULL;
{
std::unique_lock<std::mutex> lock(_mutex);//加锁
_cond.wait(lock, [&](){ return _loop != NULL; });//loop为NULL就一直阻塞
loop = _loop;
}
return loop;
}
};