30muduo_net库源码分析(六)
1.EventThread
2.代码
1.EventLoopThread.h
// Copyright 2010, Shuo Chen. All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is a public header file, it must only include public header files.#ifndef MUDUO_NET_EVENTLOOPTHREAD_H
#define MUDUO_NET_EVENTLOOPTHREAD_H#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>
#include <muduo/base/Thread.h>#include <boost/noncopyable.hpp>namespace muduo
{
namespace net
{class EventLoop;class EventLoopThread : boost::noncopyable
{public:typedef boost::function<void(EventLoop*)> ThreadInitCallback;EventLoopThread(const ThreadInitCallback& cb = ThreadInitCallback());~EventLoopThread();EventLoop* startLoop(); // 启动线程,该线程就成为了IO线程private:void threadFunc(); // 线程函数EventLoop* loop_; // loop_指针指向一个EventLoop对象bool exiting_;Thread thread_;MutexLock mutex_;Condition cond_;ThreadInitCallback callback_; // 回调函数在EventLoop::loop事件循环之前被调用
};}
}#endif // MUDUO_NET_EVENTLOOPTHREAD_H
2.EventLoopthread.cc
// Copyright 2010, Shuo Chen. All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.// Author: Shuo Chen (chenshuo at chenshuo dot com)#include <muduo/net/EventLoopThread.h>#include <muduo/net/EventLoop.h>#include <boost/bind.hpp>using namespace muduo;
using namespace muduo::net;EventLoopThread::EventLoopThread(const ThreadInitCallback& cb): loop_(NULL),exiting_(false),thread_(boost::bind(&EventLoopThread::threadFunc, this)),mutex_(),cond_(mutex_),callback_(cb)
{
}EventLoopThread::~EventLoopThread()
{exiting_ = true;loop_->quit(); // 退出IO线程,让IO线程的loop循环退出,从而退出了IO线程thread_.join();
}EventLoop* EventLoopThread::startLoop()
{assert(!thread_.started());thread_.start();{MutexLockGuard lock(mutex_);while (loop_ == NULL){cond_.wait();}}return loop_;
}void EventLoopThread::threadFunc()
{EventLoop loop;if (callback_){callback_(&loop);}{MutexLockGuard lock(mutex_);// loop_指针指向了一个栈上的对象,threadFunc函数退出之后,这个指针就失效了// threadFunc函数退出,就意味着线程退出了,EventLoopThread对象也就没有存在的价值了。// 因而不会有什么大的问题loop_ = &loop;cond_.notify();}loop.loop();//assert(exiting_);
}
3.Reactor_test06.cc
#include <muduo/net/EventLoop.h>
#include <muduo/net/EventLoopThread.h>#include <stdio.h>using namespace muduo;
using namespace muduo::net;void runInThread()
{printf("runInThread(): pid = %d, tid = %d\n",getpid(), CurrentThread::tid());
}int main()
{printf("main(): pid = %d, tid = %d\n",getpid(), CurrentThread::tid());EventLoopThread loopThread;EventLoop* loop = loopThread.startLoop();// 异步调用runInThread,即将runInThread添加到loop对象所在IO线程,让该IO线程执行loop->runInLoop(runInThread);sleep(1);// runAfter内部也调用了runInLoop,所以这里也是异步调用loop->runAfter(2, runInThread);sleep(3);loop->quit();printf("exit main().\n");
}
30muduo_net库源码分析(六)相关推荐
- Android主流三方库源码分析(九、深入理解EventBus源码)
一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...
- 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)
大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...
- sigslot库源码分析
言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...
- surprise库源码分析
最近工作上需要使用到协同过滤,来计算相似度,因此根据https://blog.csdn.net/weixin_43849063/article/details/111500236的步骤对surpris ...
- Python Requests库源码分析
1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...
- 【转】ABP源码分析六:依赖注入的实现
ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...
- motan源码分析六:客户端与服务器的通信层分析
本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...
- cJSON库源码分析
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的Json格式解析库. 那什么是Json格式?这里照搬度娘百科的说法: Json(JavaScript Object Notat ...
- python库源码分析_python第三方库Faker源码解读
源码背景 Faker是一个Python第三方库,GITHUB开源项目,主要用于创建伪数据创建的数据包含地理信息类.基础信息类.个人账户信息类.网络基础信息类.浏览器信息类.文件信息类.数字类 文本加密 ...
最新文章
- 2021-2027年中国一氧化氮行业市场研究及前瞻分析报告
- oracle exists 变量,Num58 Oracle总结
- 全部都是div,换点新花样。【HTML5的标签】
- 数据结构和算法练习网站_视频和练习介绍了10种常见数据结构
- 中班机器人上课视频_家委会:出班费买智能扫地机器人,不用家长搞卫生了,莫名其妙...
- python怎么封装供java调用_python调用第三方java包实例
- Box2D v2.0.1 用户手册
- Intel 64/x86_64/x86/IA-32处理器串行化指令(2) - 参考
- DataNode的流式接口
- torch使用cudnn7
- Vue2.x全家桶WebApp
- Java常用软件安装包分享
- 微软Exchange Server 0Day漏洞,尽快修复
- Error: Device or resource busy
- excel提取身份证出生日期_Excel如何从身份证号码中提取年龄
- 如何导出一篇英文文献的全部参考文献
- ubuntu下载todesk安装包
- 自制J-LINK遇到的问题
- 重装mysql_重装MySQL步骤详解
- 12天背诵楞严咒的技巧_如何背诵楞严咒?背诵楞严咒的诀窍