本文为初见,Netplus快速开始之PingPong Example系列第二篇
1. 背景
网络信息传递中的两个基本问题,即建立连接,传递消息,都已被各操作系统解决好了,各家的技术细节并不一样,暴露出来的接口虽有相似之处,但仍然难以做到一份代码,到处运行。一些代码库,如libuv, libevent,在系统兼容以及IO事件通知的上面做得非常优秀,然,从实际应用开发者的角度来看,它们仍然遗留了很多需要开发者自己去解决的问题,如跨平台的一些细节、IO事件处理、线程安全及性能调优、应用层协议的解析。而这些问题都涉及更多的知识以及编程经验,这就是门槛啊,任何试图降低门槛的努力都是有价值的,也肯定是值得的。
为降低门槛,Netplus在很多方面都做尝试。
2. Netplus为降低门槛进行的尝试
2.1 简化对象管理
对象管理是个古老的话题,各语言在这方面都做得相当出色,尤其是Java,需要的时候,我们new一个,不用的时候,直接置null, 这种简单直接的使用方式,着实迷人,c++是否也能如此呢?
c++在这方面也是努力,stl中有如下方案:
- std::auto_ptr
- std::unique_ptr
- std::shared_ptr
- std::weak_ptr
- std::enable_shared_from_this
已经有这么多解决方案了,还没有解决好问题吗?为啥,Netplus又造轮子 ?
简单列一下理由如下:
- 并没有解决好线程安全的问题。
- shared_ptr使用不当会造成二次delete,最典型的当属如这样的代码,int* p=new int; std::shared_ptr<int>(p); std::shared_ptr<int>(p)。虽然这是一个错误的使用案例,但是我相信写过这样代码的人应该不少。
- 有多种方式获取到raw_pointer,有了raw_pointer。特别是周期长,不段有新人加入的项目,鬼晓得会有人拿这个raw_p