GC, the simple solution

Don Clugston dac at nospam.com.au
Fri Jun 16 04:49:02 PDT 2006


Sean Kelly wrote:
> Lionello Lunesu wrote:
>> Sean Kelly wrote:
>>> Lionello Lunesu wrote:
>>>> Interesting indeed!
>>>>
>>>> I'm currently reading Boehm's article "Threads Cannot be Implemented 
>>>> as a Library". I wonder if this means that threads should become 
>>>> primitives of some sort [in D] ?
>>>
>>> It's been a while since I read that article, but I think D already 
>>> has enough in-language recognition of threading issues to escape 
>>> most/all of the problems Boehm mentions: Thread is a standard library 
>>> component rather than a third-party component, synchronized is 
>>> available for mutual exclusion, and volatile (plus perhaps inline asm 
>>> code) is enough to manage lock-free work.  A more robust 
>>> multithread-aware memory model would be good to have, but it's a 
>>> sticky enough issue that I think Walter is right for waiting on that 
>>> for now.
>>
>> ...that leaves only atomic operations? Or would "volatile" or 
>> "synchronized" take care of memory fencing and such?
> 
> "volatile" is actually intended to address compiler optimizations in a 
> similar way to how memory barriers address CPU optimizations.  It is a 
> necessary part of any lock-free operation in D.  "synchronized" is used 
> for mutual exclusion and typically involves a mutex, so while it should 
> have the proper effect, it's not lock-free.
> 
>> Would be nice if there were an built-in type with overloaded ++x, x++, 
>> x=y, all atomic. (I've seen some C++ templates that do this.)
> 
> It would be nice, but I've yet to see a proposal that I like.  The 
> problem is that in addition to pure atomic operations (which is how the 
> x86 typically works by default) lock-free programmers typically want to 
> make an assertion about instruction ordering as well, and built-in 
> semantics don't expose this very cleanly.  One could simply have 
> volatile types similar to Java where no optimization is allowed on them 
> at all, but this may be too heavy-handed to satisfy some folks.  For 
> now, I think a library solution is a reasonable alternative.  Ares has 
> had one for quite a while and it's almost standalone so it could be used 
> with Phobos with very little effort. 

I'd really like to see this included in the standard distribution.
Has anyone made a general-purpose lock-free linked list? Just a 
low-level list of void * pointers would be fantastic.

  The documentation is here (DDoc
> seems to want to generate docs for private template functions, so I 
> apologize for the clutter):
> 
> http://svn.dsource.org/projects/ares/trunk/doc/ares/std/atomic.html
> 
> And the code itself is here:
> 
> http://svn.dsource.org/projects/ares/trunk/src/ares/std/atomic.d
> 
> It currently only works on the x86 and is really intended for API 
> developers, but it does the trick and I'll expand it as needed.  For 
> typical use, msync.acq (acquire), msync.rel (release), and msync.none 
> are the flags you're likely to care about.  The other more fine-grained 
> flags just alias acq/rel on x86 anyway.  In case the docs are confusing, 
> the API calls supported are:
> 
> load
> store
> storeIf (ie. CAS)
> increment
> decrement
> 
> 
> Sean



More information about the Digitalmars-d mailing list