draft proposal for ref counting in D
Walter Bright
newshound2 at digitalmars.com
Wed Oct 9 18:49:04 PDT 2013
Rainer Schuetze wrote:
>> Why is it necessary to put a lock around the pair?
> To be more accurate, it is the assignment and the Release that have to
> be atomic, in addition to a concurrent read with AddRef. Imagine the
> reading thread is suspended while just having read the pointer, but not
> incremented the reference count yet. If an assignment with release and
> deletion is performed before the thread resumes, AddRef is called on
> garbage.
On my way to work today, I figured that a safe but slow implementation can work,
if the interface is not AddRef/Release, but
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;
}
}
}
Reading/Writing null (e.g. when constructing or destructing a reference) would
have to be special cased, that would not be necesessary with free functions.
More information about the Digitalmars-d
mailing list