The following testcase (when executed on dual core at least) results in a endless loop inside atomicOp.

import std.stdio;
import std.concurrency;

enum Messages {
        GO,
        END
}

shared class Account {
        private double amount = 0;
        
        double getAmount() const {
                return amount;
        }
        
        void change(double 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);
        send(father,Messages.END);
}

void main(string[] args)
{
        bank = new Account();
        spawn(&otherThread,thisTid);
        receiveOnly!(Messages)();
        for(int i=0;i<1000;i++)
                bank.change(+100);
        receiveOnly!(Messages)();
        writefln("Program finished. Amount is %s",bank.getAmount());
}

Is this a bug, or am I doing something wrong here?
If it is a bug it is kind of critical because people which are reading the "the D programming language" book won't be happy to find out that some of the given examples do not work yet.
--
Kind Regards
Benjamin Thaut

Reply via email to