• 1.11.C++项目:仿muduo库实现并发服务器之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模块和线程整合起来!

    (三)功能设计

    1. 创建线程
    2. 在线程中实例化 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
    • 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
  • 相关阅读:
    数据分析笔记1
    状压dp:Gym - 102832J
    java ftputils 模拟测试方法 有效
    面试字节,过关斩将到 3 面,结果找了个架构师来吊打我?
    最少拦截系统 (贪心算法)
    使用 TiUP 部署 TiDB 集群
    堆的应用:堆排序及TopK问题
    并查集模版以及两道例题
    渗透测试流程是什么?7个步骤给你讲清楚!
    Docker安装Nginx并修改Nginx配置文件
  • 原文地址:https://blog.csdn.net/weixin_54447296/article/details/133682565