[C++]为什么我不用shared_ptr管理网络连接



为什么我不用shared_ptr管理网络连接:

shared_ptr和weak_ptr等虽然方便,但是必须注意他们不是严格的线程安全的

服务端网络层在管理连接对象时就遇到过:在智能指针计数归零的但未析构的一瞬间,引用计数又被增加了(因为多线程增加),而shared_ptr是不支持引用计数从0恢复到1以后阻止析构恢复常态的。

另外还有一个缺陷是我使用的shared_ptr(来自boost)没有手动增加引用计数的功能,如果要增加就必须用一个shared_ptr来引用之,而连接对象在有数据要处理时需要自己防止析构,只能自己应用自己,造成了麻烦


后来我使用了复杂的C++模板技巧(VS2008)实现了一个多线程 对象池,使用句柄管理(随机循环句柄,仿HWND),持有句柄者能主动发现对象是否被销毁,

每个池内对象自带各种锁Flag状态(有构造和析构状态)和锁次数(类似引用计数),

逻辑层随意持有对象句柄,在使用的时候用对应状态(读状态/写状态等)的函数来获取指针,并在使用的瞬间增加引用计数,用完的瞬间释放引用计数,

这些状态还能帮助对象防止析构


事实证明采用了这个多线程对象池后,避免了很多需要脑经急转弯的代码(虽然这个对象池本身的实现需要强力的脑经急转弯),给网络连接对象编写提供了强有力的帮助,另外采用了原子量,性能比shared_ptr有所提升

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值