$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: bill_kempf (williamkempf_at_[hidden])
Date: 2002-02-11 10:10:58
--- In boost_at_y..., Darin Adler <darin_at_b...> wrote:
> On 2/10/02 4:26 PM, "Wyss, Felix" <felixw_at_i...> wrote:
> 
> >> Yes, you are right. Keeping a weak_ptr in thread A while all 
shared_ptr
> >> owners are in thread B is asking for trouble. This is an 
inherent property
> >> of weak_ptr (and any non-owning pointer in general, starting 
with raw
> >> pointers) and cannot be fixed.
> > 
> > This can be fixed by providing a way to obtain a strong pointer 
from the weak
> > pointer.  Instead of the get() method, I suggest providing a 
strong() method
> > which returns a shared_ptr.
> 
> Or maybe even an implicit conversion from weak_ptr to shared_ptr.
> 
> Unfortunately, making a thread-safe implementation of this 
conversion
> operation is non-trivial, more complex than the thread safety 
that's already
> in shared_ptr. Peter Dimov can explain why; maybe we can get him to 
explain
> in this thread.
I'm unconvinced that weak_ptr<> is useful in a MT program.  At least 
not if ANY of the pointers (shared_ptr<> or weak_ptr<>) are shared 
across thread boundaries.  In this case the weak_ptr<> can't report a 
deleted object in any way that's useful.
weak_ptr<foo> pw(ps);
...
if (pw != 0) {
  // pw == 0 is possible here!!
}
A redesign might help.  If the weak_ptr<>'s only functionality was 
conversion to a shared_ptr<> where you'd get a NULL shared_ptr<> if 
the object were gone, you wouldn't have the above problem.  However, 
it wouldn't be efficient either (and would be danged difficult to 
implement).
Bill Kempf