On 11/1/21 14:42, Steven Schveighoffer wrote:
That isn't exactly true. Member variables are members of the object. If
the object is shared, the member variables are shared. If the object is
local the variables are local.
Thread local really only applies to *static* variables, such as globals
or members declared static. If that were the case, yes, the other thread
would not see the object.
I did not respond to the OP because I also don't know why it wouldn't
work. But I also don't know what all the code is doing.
-Steve
Out of curiosity, what happens with members that are declared `shared`
in a non-shared object?
I thought that declaring an object `shared` "promotes" its members, but
that it wasn't strictly needed for a non-shared object to have shared
members, but I might be wrong here.
```
struct S {}
class A {
S s1;
shared S s2;
}
void main() {
A a1 = new A();
pragma(msg, typeof(a1.s1)); // S
pragma(msg, typeof(a1.s2)); // shared(S)
shared A a2 = new shared A();
pragma(msg, typeof(a2.s1)); // shared(S)
pragma(msg, typeof(a2.s2)); // shared(S)
}
```
https://run.dlang.io/is/skCfvE
Of course I don't know the practical differences in the actual
accessibility of the different members beyond the type system.
Is there any way to check if a pointer is actually TLS or global
storage? If `a1.s2` can't be properly accessed from different threads,
I'd consider that a big bug in the `shared` implementation.
Best,
A.