[dmd-concurrency] composability
    Benjamin Shropshire 
    benjamin at precisionsoftware.us
       
    Thu Jan  7 11:21:35 PST 2010
    
    
  
Kevin Bealer wrote:
> So, if I understand correctly, the main thing the shared provides 
> (relative to, say, an implicitely shared global in in gcc) is 
> (relatively) simple memory barriers in the right places as well as 
> compare and swap, which can be used to do lock-free style programming?
>  
> One thing that strikes me as potentially tricky with the lock free 
> style -- it seems like it isn't composable at all.  What I mean is 
> that even if you get a really high quality and fast lock-free hash map 
> running, if you need to take something (a struct, say) out of the hash 
> map, do something with it, and then put it back in, you can write 
> shared lock-free logic for the struct, and for the hash map, but you 
> can't easily make the entire operation of take-out, update, put-back 
> lock free in any easy way, right?
If the Hash table is designed with composeability in mind:
With a little hand waving...
struct Ref(T) { T v; T* base; alias v this; }
class CASHashMap(V,K)
{
    private T*[] data; // store stuff as array of pointers to immutable 
objects
    Ref!(V) opIndex(K);  // return the value by value with a pointer to 
the source
    Ref!(V) opIndexAssign(ref Ref!(T), K); // make copy of new value and 
CAS it with the old one, do something* on failure
}
* thrown on failure might work. Another option would be to only allow 
update of Ref!(T).v via a delegate that gets called again on failure but 
thats messy.
OTOH that is just another form of the CAS 2 vs CAS 3 problem. The system 
only works if you have the right abstractions.
-BCS
    
    
More information about the dmd-concurrency
mailing list