www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Is this atomic code correct?

reply BCS <none anon.com> writes:
I find my self in need of some thread safe, lock free code to update a value 
by way of a self referential expression

x = min(x,y); 

Being the abstraction addict I am, I went for the general solution and came 
up with this:

void AtomicEvalAssign(T)(ref T to, lazy T from)
{
	T  old;
	do
	{
		old = atomicLoad(to);
	} while(!atomicStoreIf(to, from(), old));
}

AtomicEvalAssign(x, min(x,y));

My question is; will that work or might the lazy arg not refetch the value?
Mar 17 2009
parent reply Sean Kelly <sean invisibleduck.org> writes:
BCS wrote:
 I find my self in need of some thread safe, lock free code to update a 
 value by way of a self referential expression
 
 x = min(x,y);
 Being the abstraction addict I am, I went for the general solution and 
 came up with this:
 
 void AtomicEvalAssign(T)(ref T to, lazy T from)
 {
     T  old;
     do
     {
         old = atomicLoad(to);
     } while(!atomicStoreIf(to, from(), old));
 }
 
 AtomicEvalAssign(x, min(x,y));
 
 My question is; will that work or might the lazy arg not refetch the value?
min() doesn't perform atomic operations (in fact, it probably just takes the parameters by value) so it isn't guaranteed to refetch the values.
Mar 18 2009
parent reply BCS <none anon.com> writes:
Hello Sean,

 min() doesn't perform atomic operations (in fact, it probably just
 takes the parameters by value) so it isn't guaranteed to refetch the
 values.
 
Hmmm. I wonder how that mixes with it being a delegate. I guess inlining and whatnot would make a difference. Ug.
Mar 18 2009
parent Sean Kelly <sean invisibleduck.org> writes:
BCS wrote:
 Hello Sean,
 
 min() doesn't perform atomic operations (in fact, it probably just
 takes the parameters by value) so it isn't guaranteed to refetch the
 values.
Hmmm. I wonder how that mixes with it being a delegate. I guess inlining and whatnot would make a difference. Ug.
Yeah. It would probably actually work with the current DMD, but if a compiler inlined the call to min it could cache the result in a register and reuse it.
Mar 19 2009