本文主要是介绍1.11.C++项目:仿muduo库实现并发服务器之LoopThread的设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、LoopThread模块
- 二、实现思想
- (一)功能
- (二)意义
- (三)功能设计
- 三、代码
一、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;}
};
这篇关于1.11.C++项目:仿muduo库实现并发服务器之LoopThread的设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!