On Friday, 3 June 2016 at 12:41:39 UTC, Jonathan M Davis wrote:
...
On a side note, be warned that you almost certainly shouldn't
be using __gshared like this. It's intended for interacting
with C code not for D objects to be marked with D. As far as
the type system is concerned, __gshared isn't part of the type,
and the variable will be treated as thread-local by all of the
code that uses it, which can result in really nasty, subtle
bugs when the compiler starts doing stuff like optimizations.
If you want to be sharing D objects across threads, you really
should be using shared so that the compiler knows that it's
shared across threads and will treat it that way.
Thanks to point this out. What does shared really do behind the
scene ?
Does it add synchronization instructions ?
In my case I really don't want the compiler to add
synchronization instructions because the objects are immutable
from the user perspective. This is enforced by the interface. Tho
objects are fully instantiated in a private static this() {}
function which shouldn't be affected by multi-threading since it
is executed at startup.
The unpleasant side effect of shared is that I then have to use
shared(Info) instead of the shorter type name Info.
What are the subtle and nasty bugs you are referring to ?