From: Alexander Terekhov (terekhov_at_[hidden])
Date: 2005-04-05 09:08:09


Peter Dimov wrote:
[...]
> Hm. You are right in theory, but in practice, I know that this is g++ on
> x86, and I know that it doesn't do such things.
>
> (Aside: why invent naked_competing instead of just using nsync as per PL2?)

G++ is (relatively) easy to patch, and naked_competing simply sounds
better. ;-)

[...]
> > ... you also have and manage client-provided "deleter" objects and
> > I see no reason why weak_ptr clients may NOT have access to them
> > (resulting in similar problem with respect to access and
> > destruction as with Whitehead's mutex).
>
> Hmmmm.
>
> IIUC, you are saying that a thread can obtain access to the deleter using
> get_deleter, then hold on to the returned pointer after the shared_ptr is
> destroyed while holding only a weak_ptr to the object to keep the deleter
> alive?

Not necessarily just to keep the deleter alive. But ok, why not?

>
> I'm having trouble picturing a situation where disallowing this will be a
> problem.

I'd rather provide

  template<class D, class T>
      D * get_deleter(weak_ptr<T> const & p);

in addition to your existing

  template<class D, class T>
      D * get_deleter(shared_ptr<T> const & p);

>
> Via the pointer you can only _read_ the deleter safely, and only if its
> operator() is const (because operator() can be called at any time.) Hence,
> you could have performed the reads beforehand, while still holding a
> shared_ptr.

Deleter can synchronize mutations (which might be caused by both
shared_ptr and weak_ptr clients) internally with or *without*
locks (using some lock-free stuff).

>
> This aside, is this a problem on x86?

No.

> I don't think it is since the load has
> acquire semantics either way.

Right. But I'd still (apart from evil-but-lawful G++ patches/new
versions theory, not current practice) hide it in asm'd "may not
store zero" decrement.

regards,
alexander.