From: Peter Dimov (pdimov_at_[hidden])
Date: 2006-04-15 07:58:43
Eric Niebler wrote:
> I'm thinking about replacing some uses of shared_ptr with
> intrusive_ptr, but I've got questions. One of the nice things about
> shared_ptr is the lock-free thread-safe ref counting. I want my
> intrusive_ptr to have the same safety and efficiency, but I don't see
> how to get it. I see $boost_root/detail/atomic_count.hpp, but
> shared_ptr doesn't use it. Why not? And why is it in detail/? Should
> I not consider using it?
shared_ptr doesn't use atomic_count because the addition of weak_ptr has
made atomic_count's interface insufficient.
atomic_count is in detail:: because I didn't consider it ready for boost::.
On the other hand, if it works for you, there is no reason to not use it.
> Taking in the bigger picture, intrusive_ptr requires people to write
> their own add_ref and release functions, most of which will probably
> end up using ++ and -- on a plain integer. This is totally broken in
> multi-threaded applications, right?
Using ++ and -- on a plain integer without synchronization is broken in MT
> Isn't it dangerous to not provide
> complementary utilities for correctly managing reference counts? It
> seems to me intrusive_ptr is impossible to use safely and portably.
> What have I missed?
It's possible to use intrusive_ptr safely and portably if you already have
an existing library that provides intrusive reference counting without also
supplying a corresponding pointer type, and one of the goals of
boost::intrusive_ptr is to establish a standard "corresponding pointer type"
for such libraries.
However, you are right that intrusive_ptr doesn't help the implementers of
these libraries to get their reference counting correct, and that it
probably should do that.