Thread overview
how to stop a variable from being optimized out
Feb 24, 2015
Rory
Feb 24, 2015
ketmar
Feb 24, 2015
Rory
Feb 24, 2015
ketmar
February 24, 2015
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
February 24, 2015
On Tue, 24 Feb 2015 06:29:33 +0000, 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.

February 24, 2015
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.

February 24, 2015
On Tue, 24 Feb 2015 12:50:53 +0000, 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.