On Monday, 8 August 2022 at 17:45:03 UTC, bauss wrote:
On Monday, 8 August 2022 at 13:55:02 UTC, ag0aep6g wrote:
auto x = s.x;
[...]
Your problem is here and not because it was __gshared.
You're copying the value and obviously it can be changed in the
meantime, that's common sense.
The value of `x` changes while `x` is being read.
You shouldn't use it like that. You should access s.x directly
instead.
```
// auto x = s.x;
assert(s.x == 0 || s.x == -1, to!string(s.x, 16));
```
this replaces one race by three races which even prevents
spotting the reason for the triggered assertion:
```
$ > ./race
core.exception.AssertError@race.d(40): FFFFFFFFFFFFFFFF
```
And in the case of shared it can leave the same result if the
reading thread locks first then it will read and process the
value before it's changed.
???