| Thread overview |
|---|
February 24, 2015 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
| ||||
February 24, 2015 Re: how to stop a variable from being optimized out | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Rory Attachments: | 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 Re: how to stop a variable from being optimized out | ||||
|---|---|---|---|---|
| ||||
Posted in reply to ketmar | 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 Re: how to stop a variable from being optimized out | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Rory Attachments: | 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.
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply