Re: how to stop a variable from being optimized out
On Tuesday, 24 February 2015 at 06:48:26 UTC, ketmar wrote: but why do you need this? just use `atomicLoad` to get shared variable value, it will do the right caching. Nice! Thanks. Tested atomicLoad and it is slightly faster for my non blocking queue.
Re: how to stop a variable from being optimized out
On Tue, 24 Feb 2015 12:50:53 +, Rory wrote: On Tuesday, 24 February 2015 at 06:48:26 UTC, ketmar wrote: but why do you need this? just use `atomicLoad` to get shared variable value, it will do the right caching. Nice! Thanks. Tested atomicLoad and it is slightly faster for my non blocking queue. just in case: by do the right caching i meant that this is memory barrier, so compiler will not optimise your `current` away. i.e. the only thing you have to change is this line: volatile auto current = payload; // payload is a shared variable to: auto current = atomicLoad(payload); i reread my answer and found that it may be not so obvious. signature.asc Description: PGP signature
Re: how to stop a variable from being optimized out
On Tue, 24 Feb 2015 06:29:33 +, Rory wrote: Is there a way I can stop current from being optimized out without using volatile? but why do you need this? just use `atomicLoad` to get shared variable value, it will do the right caching. signature.asc Description: PGP signature
how to stop a variable from being optimized out
Hi, Is there a way I can stop current from being optimized out without using volatile? The compiler is suggesting I replace volatile with synchronized but I don't want it synchronized? Would a memory barrier work? shared n = new int(value); for (;;) { volatile auto current = payload; // payload is a shared variable if (current == payload) { // just to make sure we copied a complete value from if (current is null) { if (cas(payload, current, n)) { return true; } } } } Thanks! -Rory