这个问题问得好。
在多线程构建中shared_ptr<>
,即使对象永远不会在线程之间共享,基本上总是为原子引用计数器的递增/递减付费。
另一个缺点是 的大小shared_ptr<>
是普通指针大小的两倍。
由于这两个原因shared_ptr<>
,它从来都不是性能关键型应用程序的好选择。
多线程应用程序有几种类型的对象在线程之间共享,而大多数不是。只有线程共享对象才需要使用原子引用计数器递增/递减,而为大多数其他对象支付原子操作成本是愚蠢的。因此,为线程共享和线程非共享对象使用不同的(基本)类型并使用boost::intrusive_ptr<>
. 线程共享对象有一个原子引用计数器,而线程非共享对象有一个纯整数计数器。例如:
#include <atomic>
#include <boost/intrusive_ptr.hpp>
template<class Derived, class Counter>
class RefCounter
{
Counter ref_count_;
friend void intrusive_ptr_add_ref(RefCounter* p) {
++p->ref_count_;
}
friend void intrusive_ptr_release(RefCounter* p) {
if(!--p->ref_count_)
delete static_cast<Derived*>(p);
}
protected:
RefCounter() : ref_count_() {}
};
class NonThreadShared
: public RefCounter<NonThreadShared, unsigned>
{};
class ThreadShared
: public RefCounter<ThreadShared, std::atomic<unsigned> >
{};
int main() {
boost::intrusive_ptr<NonThreadShared> p(new NonThreadShared);
boost::intrusive_ptr<ThreadShared> q(new ThreadShared);
}