[C++]为什么我不用shared_ptr管理网络连接
2014-07-12 14:42
190 查看
为什么我不用shared_ptr管理网络连接:
shared_ptr和weak_ptr等虽然方便,但是必须注意他们不是严格的线程安全的
服务端网络层在管理连接对象时就遇到过:在智能指针计数归零的但未析构的一瞬间,引用计数又被增加了(因为多线程增加),而shared_ptr是不支持引用计数从0恢复到1以后阻止析构恢复常态的。
另外还有一个缺陷是我使用的shared_ptr(来自boost)没有手动增加引用计数的功能,如果要增加就必须用一个shared_ptr来引用之,而连接对象在有数据要处理时需要自己防止析构,只能自己应用自己,造成了麻烦
后来我使用了复杂的C++模板技巧(VS2008)实现了一个多线程 对象池,使用句柄管理(随机循环句柄,仿HWND),持有句柄者能主动发现对象是否被销毁,
每个池内对象自带各种锁Flag状态(有构造和析构状态)和锁次数(类似引用计数),
逻辑层随意持有对象句柄,在使用的时候用对应状态(读状态/写状态等)的函数来获取指针,并在使用的瞬间增加引用计数,用完的瞬间释放引用计数,
这些状态还能帮助对象防止析构
事实证明采用了这个多线程对象池后,避免了很多需要脑经急转弯的代码(虽然这个对象池本身的实现需要强力的脑经急转弯),给网络连接对象编写提供了强有力的帮助,另外采用了原子量,性能比shared_ptr有所提升
为什么我不用shared_ptr管理网络连接:
shared_ptr和weak_ptr等虽然方便,但是必须注意他们不是严格的线程安全的
服务端网络层在管理连接对象时就遇到过:在智能指针计数归零的但未析构的一瞬间,引用计数又被增加了(因为多线程增加),而shared_ptr是不支持引用计数从0恢复到1以后阻止析构恢复常态的。
另外还有一个缺陷是我使用的shared_ptr(来自boost)没有手动增加引用计数的功能,如果要增加就必须用一个shared_ptr来引用之,而连接对象在有数据要处理时需要自己防止析构,只能自己应用自己,造成了麻烦
后来我使用了复杂的C++模板技巧(VS2008)实现了一个多线程 对象池,使用句柄管理(随机循环句柄,仿HWND),持有句柄者能主动发现对象是否被销毁,
每个池内对象自带各种锁Flag状态(有构造和析构状态)和锁次数(类似引用计数),
逻辑层随意持有对象句柄,在使用的时候用对应状态(读状态/写状态等)的函数来获取指针,并在使用的瞬间增加引用计数,用完的瞬间释放引用计数,
这些状态还能帮助对象防止析构
事实证明采用了这个多线程对象池后,避免了很多需要脑经急转弯的代码(虽然这个对象池本身的实现需要强力的脑经急转弯),给网络连接对象编写提供了强有力的帮助,另外采用了原子量,性能比shared_ptr有所提升
相关文章推荐
- C++中的资源管理(一):构造自己的auto_ptr与shared_ptr智能指针
- Effective Modern C++ 条款19 用std::shared_ptr管理共享所有权的资源
- C++开发:为什么多线程读写shared_ptr要加锁的详细介绍
- C++开发:为什么多线程读写shared_ptr要加锁的详细介绍
- C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?
- C++为什么不用delete代替delete[]?
- Wi-Fi探查连接工具帮无线网络管理连接
- winForm:管理网络连接开关的小程序
- [原]调用Win32 API netapi32.dll 实现UNC(网络共享)连接的管理(一)
- 网络长连接管理开发手册
- 为什么一般不用一个整数给一个指针变量赋初值?[c/c++]
- C++:智能指针-TR1的shared_ptr和weak_ptr使用介绍
- ubuntu的网络连接管理
- 访问Android硬件资源の管理网络和Wifi连接
- C++ std::tr1::shared_ptr使用
- 【转】C++ std::tr1::shared_ptr使用
- 说说C++智能指针(1): 关于shared_ptr
- 调用Win32 API netapi32.dll 实现UNC(网络共享)连接的管理(一)
- 如何管理WINDOWS已经打开网络连接
- 我的实用设计模式之 关于Policy-based design在Windows Mobile网络连接管理的应用