`shared`...
Nicholas Wilson
iamthewilsonator at hotmail.com
Mon Oct 1 06:47:16 UTC 2018
On Monday, 1 October 2018 at 06:06:31 UTC, ag0aep6g wrote:
> `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 */
> }
> ----
We've realised that.
In order to be safe, a mutable parameter can be implicitly cast
to shared iff the parameter is also scope (that includes the
`this` reference`). With an implicit cast in place of the
explicit cast under the new rules it would fail to compile
because the `this` reference is not scope.
More information about the Digitalmars-d
mailing list