What exactly shared means?
John Colvin via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jan 2 15:51:04 PST 2015
On Friday, 2 January 2015 at 23:26:57 UTC, Jonathan M Davis via
Digitalmars-d-learn wrote:
> On Friday, January 02, 2015 19:47:50 John Colvin via
> Digitalmars-d-learn wrote:
>> On Friday, 2 January 2015 at 13:14:14 UTC, Jonathan M Davis via
>> Digitalmars-d-learn wrote:
>> > Objects in D default to being thread-local. __gshared and
>> > shared both make
>> > it so that they're not thread-local. __gshared does it
>> > without
>> > actually
>> > changing the type, making it easier to use but also dangerous
>> > to use,
>> > because it makes it easy to violate the compiler's
>> > guarantees,
>> > because it'll
>> > treat it like a thread-local variable with regards to
>> > optimizations and
>> > whatnot.
>>
>> I'm pretty sure that's not true. __gshared corresponds to
>> C-style
>> globals, which are *not* assumed to be thread-local (see
>> below).
>
> No, the type system will treat __gshared like a thread-local
> variable. It
> gets put in shared memory like a C global would be, but
> __gshared isn't
> actually part of the type, so the compiler has no way of
> knowing that it's
> anything other than a thread-local variable - which is
> precisely why it's so
> dangerous to use it instead of shared. For instance,
>
> __gshared int* foo;
>
> void main()
> {
> foo = new int;
> int* bar = foo;
> }
>
> will compile just fine, whereas if you used shared, it wouldn't.
>
> - Jonathan M Davis
I understand that. As far as optimisations and codegen go, that
is not the same as being able to assume that something is
thread-local, far from it.
The rule (in C(++) at least) is that all data is assumed to be
visible and mutable from multiple other threads unless proved
otherwise. However, given that you do not write a race, the
compiler will provide full sequential consistency. If you do
write a race though, all bets are off.
Are you telling me that D does not obey the C(++) memory model?
That would be a fatal hole in our C(++) interoperability.
AFAIK, the only data in D that the compiler is allowed to assume
to be thread-local is data that it can prove is thread-local. The
trivial case is TLS, which is thread-local by definition.
More information about the Digitalmars-d-learn
mailing list