More radical ideas about gc and reference counting

Rainer Schuetze via Digitalmars-d digitalmars-d at puremagic.com
Tue May 13 12:50:51 PDT 2014



On 13.05.2014 13:09, "Marc Schütz" <schuetzm at gmx.net>" wrote:
> On Tuesday, 13 May 2014 at 06:06:40 UTC, Rainer Schuetze wrote:
>>
>>
>> On 12.05.2014 13:53, "Marc Schütz" <schuetzm at gmx.net>" wrote:
>>>
>>> I'm surprised that you didn't include:
>>>
>>> 3. Thread-local GC, isolated zones (restricting where references to
>>> objects of a particular heap can be placed), exempting certain threads
>>> from GC completely, ...
>>
>> This comes up from time to time, but to me it is very blurry how this
>> can work in reality.
>>
>> Considering how "shared" is supposed to be used to be useful (do some
>> locking, then cast away "shared") there is no guarantee by the
>> language that any object is actually thread local (no references from
>> other threads). Working with immutable (e.g. strings) is shared by
>> design.
>
> Yes, but only a part of the data is shared. I suspect the majority of
> the data in typical programs will be thread-local. If you use a message
> passing model, you can improve that even further (though it requires a
> way to move an object to another thread's heap). This way, you can - in
> the best case - avoid the shared heap completely.

Possible, but this is with a language without shared data (including 
immutable), not D. Safely transferring a large object tree from one 
thread to another will be very expensive. If you try to optimize that, 
the D compiler won't help you to guarantee memory safety.

Actually I don't have much experience with "shared" (I usually use 
__gshared if I need a shared global). Maybe I understand the idea better 
if you show what happens with this code when run with thread local GC:

class C { C next; }

shared(C) list;

C newC()
{
	return new C; // allocated on the local heap?
}	

void prependToList(C c)
{
	synchronized(list)
	{
		C lst = cast(C) list;
		c.next = lst;  // anything special happening here?
		list = cast(shared(C)) c;  // and here?
	}
}

void callMeFromMultipleThreads()
{
	prependToList(newC());
}


More information about the Digitalmars-d mailing list