Interesting! I get the same result, ie an infinite loop, with the CPU at 100%
Some things I noticed: - Changing the for-loops to 100 or 10 doesn't help. - Changing the atomicOp from "+=" to just "+" makes it work (although the account doesn't get changed) - Adding a Thread.sleep(1000) in one of the for-loops, before the call to atomic-op, makes it all work with "+=" as well By looking at the code in atomic.d it looks the "+="-operator ends up here: // L#131..: T get, set; do { get = set = atomicLoad!(msync.raw)( val ); mixin( "set " ~ op ~ " mod;" ); } while( !cas( &val, get, set ) ); return set; And I suppose the cas()-function never returns true? I don't know how atomic is supposed to work, so I'm not sure if it's a bug or not. I'm no expert with D, or threading for that matter, so I don't know. (I'm just an expert guesser : ) I guess bug! BR /HF Benjamin Thaut Wrote: > I recently read the book "the D programming language" and wanted to try > out a few of the multithreaded examples pointed out in this book. I > tried to write a version of the bank account example using the atomicOp > from core.atomic. But when I compile it, it never finishes, it just gets > stuck in a endless loop inside atomic.d I think. > Here is the code: > > import std.stdio; > import std.concurrency; > > enum Messages { > GO > } > > shared class Account { > private float amount = 0; > > float getAmount() const { > return amount; > } > > void change(float change){ > atomicOp!"+="(amount,change); > } > } > > shared Account bank = null; > > void otherThread(Tid father){ > send(father,Messages.GO); > for(int i=0;i<1000;i++) > bank.change(-100); > } > > void main(string[] args) > { > bank = new Account(); > spawn(&otherThread,thisTid); > receiveOnly!(Messages)(); > for(int i=0;i<1000;i++) > bank.change(+100); > writefln("Program finished. Amount is %s",bank.getAmount()); > } > > If you could please point out what I did wrong I would be very glad. If > I did not do anything wrong, I don't quite understand whats the exact > problem because the code inside atomic.d looks good (at least at my > level of understanding) > > -- > Kind Regards > Benjamin Thaut