`shared`...

ag0aep6g anonymous at example.com
Mon Oct 1 06:06:31 UTC 2018


On 10/01/2018 04:29 AM, Manu wrote:
> struct Bob
> {
>    void setThing() shared;
> }
[...]
> void f(ref shared Bob a, ref Bob b)
> {
>    a.setThing(); // I have a shared object, can call shared method
> 
>    b.setThing(); // ERROR
> }
> 
> This is the bit of the design that doesn't make sense to me...
> The method is shared, which suggests that it must handle
> thread-safety. My instance `b` is NOT shared, that is, it is
> thread-local.
[...]
> I feel like I don't understand the design...
> mutable -> shared should work the same as mutable -> const... because
> surely that's safe?

`shared` isn't analogous to `const`. It's analogous to `immutable`. 
Functions dealing with `shared` data can assume that other threads also 
see the data as `shared`. If you allow calling `shared` methods on 
non-`shared` objects, you're breaking that.

Example:

----
struct Bob
{
   int* p;
   void doThing() shared
   {
     p = &s;
   }
}

shared int s;

void main()
{
   Bob bob;
   (cast(shared Bob)bob).doThing();/* You'd make the cast implicit. */

   import core.thread;
   import core.atomic;
   enum n = 1_000_000;
   auto t = new Thread(() { foreach (i; 0 .. n) atomicOp!"+="(s, 1); });
   t.start();
   foreach (i; 0 .. n) ++*bob.p;
   thread_joinAll();

   import std.stdio;
   writeln(s); /* usually not "2000000", because of race */
}
----


More information about the Digitalmars-d mailing list