摘要:是一个基于的封装网络库,基于本人实际项目需求开发并使用。未发现内存泄漏及崩溃相关。对线程安全做了优化是一个非线程安全的库,跨线程发送数据数不允许的。
libuv_cpp11是一个基于libuv的C++封装网络库,基于本人实际项目需求开发并使用。接口较为简单易用,并对libuv一些特性做了扩展及优化。压测结果稳定、高效。未发现内存泄漏及崩溃相关bug。
为什么需要封装libuv
截至目前,C++没有标准网络库,常见的有ACE和boost.asio。ACE较为庞大臃肿,封装复杂,个人不推荐。boost.asio是boost库的一部分,需要依赖boost的部分实现,使用asio需要在项目引入较为庞大的boost库。而C语言的网络库主要有libevent、libev及libuv。libuv是nodejs的底层,较为成熟。所以如果在项目需要一套轻量级,且没有太多依赖的网络组件,最好的办法,还是自己封装一套。
libuv_cpp11功能简介
1.实现了C++功能的回调
首先libuv是一个C语言库,意味着回调函数是C语言的回调,所以直接使用libuv网络消息回调,相关对象必须是全局的或者static对象,这是令人难以容忍的。这里通过libuv的用户数据功能实现了C++风格的回调,回调函数可以类成员函数,或者lambda。同时封装了TcpServer及TcpClient等类,简化编程。
2.对线程安全做了优化
libuv是一个非线程安全的库,跨线程发送数据数不允许的。libuv_cpp11中实现了线程安全的跨线程write数据操作。基于libuv的async异步机制实现,同时在跨线程调用时候会检查当前调用线程,如果在该loop线程中则直接发送,减少了不必要的性能损耗。实现如下:
void uv::EventLoop::runInThisLoop(const std::function& func) { if (nullptr == func) return; if (isRunInLoopThread()) { func(); return; } async_->runInThisLoop(func); }
同时libuv的aysnc接口存在多次调用只执行一次的可能(特性),比如有些操作需要在回调里面释放数据,这样就会内存泄漏。libuv_cpp11中的Async类优化这个问题,确保每次调用一定会被执行。
3.实现了定时器及时间轮
对libuv定时器做了一层封装,并实现了一个时间复杂度O(1)的时间轮,用于检测心跳超时。
4.实现整包发送/接受协议机制
实现了ListBuffer和CycleBuffe两种缓存机制,用于解决TCP的粘包及残包。数据会重新组成完整的包数据用于读取。性能测试显示CycleBuffe会损失20%~30%的性能。
5日志接口
libuv_cpp11没有实现日志功能,但是保留了接口,可以注册/绑定到自定义日志库中使用。
libuv_cpp11的使用
详见example文件夹:https://github.com/wlgq2/libu...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/11657.html
摘要:概述本文主要介绍了我对的一些核心特性的理解,包括架构特点机制核心模块与简单应用。在此期间,主线程继续执行其他任务。延续了浏览器端单线程,只用一个主线程执行,不断循环遍历事件队列,执行事件。 原文地址在我的博客,转载请注明来源,谢谢! node是在前端领域经常看到的词。node对于前端的重要性已经不言而喻,掌握node也是作为合格的前端工程师一项基本功了。知道node、知道后端的一些东西...
摘要:概述相信很多的人,每天在终端不止一遍的执行着这条命令,对于很多人来说,它就像一个黑盒,并不知道背后到底发生了什么,本文将会为大家揭开这个神秘的面纱,由于本人水平有限,所以只是讲一个大概其,主要关注的过程就是模块的初始化,和的部分基本没有深入 概述 相信很多的人,每天在终端不止一遍的执行着node这条命令,对于很多人来说,它就像一个黑盒,并不知道背后到底发生了什么,本文将会为大家揭开这个...
摘要:单线程使用单线程来运行,而不是向之类的其它服务器,每个请求将生产一个线程,这种方法避免了上下文切换和内存中的大量执行堆栈,这也是和其它服务器为解决上一个年,著名的并发连接问题而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);当我们学习一项新的事物的时候,我们首先要知道它来...
摘要:具体调用链路如图函数主要是解析启动参数,并过滤选项传给引擎。查阅文档之后发现,通过指定参数可以设置线程池大小。原来的字节码编译优化还有都是通过多线程完成又继续深入调查,发现环境变量会影响的线程池大小。执行过程如下调用执行。 作者:正龙 (沪江Web前端开发工程师)本文原创,转载请注明作者及出处。 随着Node.js的普及,越来越多的开发者使用Node.js来搭建环境,也有很多公司开始把...
阅读 1938·2021-11-22 14:56
阅读 6729·2021-09-08 10:45
阅读 1791·2019-08-30 13:54
阅读 2712·2019-08-29 16:54
阅读 1900·2019-08-29 14:20
阅读 1654·2019-08-29 12:25
阅读 1726·2019-08-29 12:17
阅读 2045·2019-08-28 17:46