MIT 2012分布式课程基础源码解析-事件管理封装
2016-08-17 23:08
495 查看
这部分的内容主要包括Epoll/select的封装,在封装好相应函数后,再使用一个类来管理相应事件,实现的文件为pollmgr.{h, cc}。
事件函数封装
可看到pollmgr.h文件下定一个了一个虚基类aio_mgr
View Code
具体使用时,只需获得单例类即可,然后再添加相应的套接字及回调函数,添加都是线程安全的,因为在相应的实现上都会阻塞在内部互斥变量m_上
事件函数封装
可看到pollmgr.h文件下定一个了一个虚基类aio_mgr
//循环的主方法 void PollMgr::wait_loop() { std::vector<int> readable; //可读套接字的vector std::vector<int> writable; //可写套接字的vector // while (1) { { ScopedLock ml(&m_); if (pending_change_) { pending_change_ = false; VERIFY(pthread_cond_broadcast(&changedone_c_)==0); } } //首先清空两个vector readable.clear(); writable.clear(); //这里便监听了事件,读或写事件,有时间发生便将事件的fd插入相应的vector aio_->wait_ready(&readable,&writable); //如果这次没有可读和可写事件,则继续下一次循环 if (!readable.size() && !writable.size()) { continue; } //no locking of m_ //because no add_callback() and del_callback should //modify callbacks_[fd] while the fd is not dead for (unsigned int i = 0; i < readable.size(); i++) { int fd = readable[i]; if (callbacks_[fd]) //相应的回调函数读取套接字上的数据 callbacks_[fd]->read_cb(fd); } for (unsigned int i = 0; i < writable.size(); i++) { int fd = writable[i]; if (callbacks_[fd]) callbacks_[fd]->write_cb(fd); } } }
View Code
具体使用时,只需获得单例类即可,然后再添加相应的套接字及回调函数,添加都是线程安全的,因为在相应的实现上都会阻塞在内部互斥变量m_上
相关文章推荐
- MIT 2012分布式课程基础源码解析一-源码概述
- MIT 2012 分布式课程基础源码解析-底层通讯实现
- MIT 2012分布式课程基础源码解析-线程池实现
- 百度地图 api 功能封装类 (ZMap.js) 新增管理事件功能 [源码下载]
- Android源码基础解析之HOME事件流程
- Android源码基础解析之截屏事件流程
- Android源码基础解析之电源开关机按键事件流程
- GeoServer源码解析和扩展 (一)基础篇
- Cassandra 源码解析 3: 分布式hashtable(DHT) 和 Locator
- Cassandra 源码解析 4: GMS 集群管理
- spring对java线程池封装源码解析
- 安全信息与事件管理(SIEM)技术解析与发展分析
- C#基础解析之 Ⅴ【封装】
- 流星ASP.NET权限基础管理系统源码发布
- PowerShell_零基础自学课程_4_PowerShell的别名功能、错误管理功能和系统资源区域导航
- PowerShell_零基础自学课程_7_Powershell中重定向机制、目录和文件管理
- PowerShell_零基础自学课程_7_Powershell中重定向机制、目录和文件管理
- proc源码解析(五)--proc的管理函数(转自若木)
- PowerShell_零基础自学课程_4_PowerShell的别名功能、错误管理功能和系统资源区域导航
- 【刘庆源码共享】稀疏线性系统求解算法MGMRES(m) 之 基础类(Double类,封装double)