Possible bug in atomicOp

Sean Kelly sean at invisibleduck.org
Sat Oct 23 12:50:30 PDT 2010


Benjamin Thaut <code at benjamin-thaut.de> wrote:
> Am 23.10.2010 14:52, schrieb dsimcha:
>> == Quote from Benjamin Thaut (code at benjamin-thaut.de)'s article
>>> 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.
>> 
>> http://d.puremagic.com/issues/show_bug.cgi?id=4782
>> 
>> Basically, atomicLoad (which atomicOp uses) always returns in ALU
> > registers.
>> Floating point numbers need to be returned in floating point
> > registers.
>> Therefore, a NaN always gets returned from atomicLoad!double, and a
> > NaN isn't
>> equal to anything.
> 
> So shouldn't there be a static assert to prevent one from using
> atomicOp with floats and doubles? Or should atomicLoad be implemented
> to support floats and doubles?

The former in the short term and the latter in the long term.


More information about the Digitalmars-d mailing list