On Sat, Aug 16, 2008 at 5:42 PM, David Abrahams
<dave@boostpro.com> wrote:
on Sat Aug 16 2008, Mika Heiskanen <
mika.heiskanen-AT-fmi.fi> wrote:
> David Abrahams wrote:
>> on Sat Aug 16 2008, "Eduardo Panisset" <
eduardo.panisset-AT-gmail.com> wrote:
>>
>>> if( new_use_count == 0 )
>>> {
>>> dispose();
>>> weak_release();
>>> }
>>> How Can I ensure that the release member function wouldn't dispose
>>> a pointee
>>> more than one time ? (release executing concurrently from different
>>> shared_ptr instances)
>>
>> Because the reference count was 1, there can be only one shared_ptr
>> instance that owns the pointee. No other threads can be referencing it.
>
> But since the mutex is released, a copy could be created before the
> new_use_count test is reached? Or is it impossible to create a copy if
> use_count_ is zero?
What thread can create a copy? We know exactly what the only thread
that has a reference to the owned object is doing (it's executing the
very code we're concerned with).
Ok, I agree with that. I increment the reference count by copying a shared_ptr to another shared_ptr (before the shared_ptr releases its pointee).
However, let me give another example:
There are two threads, each one with its own shared_ptr. Thread 2 created its shared_ptr2 by copying the shared_prt1 of thread 1. Then the reference count is equal to 2.
Some time later, shared_ptr1 goes out of scope and then shared_prt2 also goes out of scope.
Consider the following event sequence:
1. Thread 1 executes release member function, and it is preempted before executing comparation if (new_use_count == 0)
2. Thread 2 executes release member function until the end, disposing the pointee.
3. Thread 1 is rescheduled, executes comparation if (new_use_count == 0) and also diposes the pointee!
Is it possible, isn't it?