how to assign to shared obj.systime?

Arafel er.krali at gmail.com
Tue Jul 14 09:56:15 UTC 2020


On 14/7/20 10:45, Dominikus Dittes Scherkl wrote:
> 
> This is generally true. Avoid sharing many variables!
> Tasks should be as independent from each other as possible. Anything 
> else is bad design doomed to run into problems sooner or later.
> Also there is really almost never a good reason to share whole classes 
> or nested structures.

Sometimes you want to encapsulate your "shared" logic.

For instance, a class (or struct) might be a thread-safe container 
responsible for storing shared data across multiple threads. Each thread 
would get a shared reference to the container, and all the 
synchronization would be managed internally by that class.

In these cases I just marked the whole container class as `shared` 
instead of having to mark every single method, in fact there were no 
non-shared methods at all.

Now I know that the members shouldn't be shared, just the methods, but 
the difference wasn't clear to me until now, because it only shows when 
you cast shared away from `this`.

If you only instantiate shared variables, all the members become 
automatically shared as well, even if they originally weren't. So far I 
was just removing shared from the individual members, so I didn't notice:

```
import std;

class S {
     SysTime a;
     shared SysTime b;

     synchronized shared void setIt(SysTime t) {
         // What I used to do
         cast () a = t; // Here you need to cast away shared anyway
         cast () b = t; // so it doesn't make any difference.

         // What I'll do from now on
         with(cast() this) { // You only notice the difference when you 
cast away `shared` from `this`
             a = t;
             // b = t; // FAILS
         }
     }
}
```


More information about the Digitalmars-d-learn mailing list