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



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

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

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

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


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

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

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

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


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

你可能感兴趣的:(多线程,网络,指针)