Rainer Schuetze wrote:

On 27.06.2013 15:50, Michel Fortin wrote:
>
> Le 27-juin-2013 à 8:03, "Rainer Schuetze" <r.sagita...@gmx.de> a écrit :
>
>> class C
>> {
>>   C readThis();
>>   void writeThis(ref C c);
>> }
>>
>> where the function can include the necessary locks, e.g.
>>
>> class C
>> {
>>   int refcnt;
>>
>>   C readThis()
>>   {
>>     synchronized(this)
>>     {
>>       refcnt++;
>>       return this;
>>     }
>>   }
>>   void writeThis(ref C c)
>>   {
>>     synchronized(c)
>>     {
>>        C x = c;
>>        c = this;
>>        if (--c.refcnt == 0)
>>          delete c;
>>     }
>>   }
>> }
>
> There's an error in this code. You must synchronize on the lock
> protecting the pointer, not on the lock at the other end of the
> pointer's value.

You're right (I have been about to run to a meeting when writing this). Then, readThis will also need a reference to the pointer. Another more obvious bug is that it should read

        if (--x.refcnt == 0)
          delete x;

> Also, you only need to do this if the pointer pointing to the object
> is shared. If the pointer is thread-local, assignment does not need
> to be atomic. And if the object itself is thread-local, not even the
> reference counter need to be atomic.
>

True, these issues only happen with shared pointers. But remember that fields in shared objects are also shared.

I also have a hard time to imagine how the code above works with reading pointers that live in registers or writing to "references to registers". These are never shared, so they could have simpler implementations.


Reply via email to