Proposal to make "shared" (more) useful

Adam D. Ruppe destructionator at gmail.com
Thu Sep 13 15:11:50 UTC 2018


On Thursday, 13 September 2018 at 14:43:51 UTC, Arafel wrote:
>  Why must __gshared be static?? (BTW, thanks a lot, you have 
> just saved me a lot of debugging!!).

The memory location differences of shared doesn't apply to class 
members. All members are stored with the instance, and shared 
only changes the type. (Contrast to global variables, where 
shared changes where they are stored - the default is to put them 
in thread-local storage, and shared moves it back out of that.)

Class static variables btw follow the same TLS rules. A static 
member is really the same as a global thing, just in a different 
namespace.


Now, the rule of __gshared is it puts it in that global memory 
storage using the unshared type. Unshared type you like here, but 
also, since normally, class members are stored in the object, 
changing the memory storage to the global shared area means it is 
no longer with the object... thus it becomes static.

> Then, how on earth are we supposed to have a struct like 
> SysTime as a field in a shared class? Other than the "fun" of 
> having a shared *pointer* to such a struct that then you can 
> cast as non-shared as needed...

What you want is an unshared type without changing the memory 
layout. There's no syntax for this at declaration, but there is 
one at usage point: you can cast away attributes on an lvalue:

shared class Foo {
         void update() {
                 // the cast below strips it of all attributes, 
including shared,
                 // allowing the assignment to succeed
                 cast() s = Clock.currTime;
         }
         SysTime s;
}



Using the private field with a public/protected/whatever accessor 
method, you can encapsulate this assignment a little and make it 
more sane to the outside world.


More information about the Digitalmars-d mailing list