Very limited shared promotion

Manu turkeyman at gmail.com
Wed Jun 19 03:02:30 UTC 2019


On Wed, Jun 19, 2019 at 12:15 AM Timon Gehr via Digitalmars-d
<digitalmars-d at puremagic.com> wrote:
>
> On 18.06.19 15:29, Steven Schveighoffer wrote:
> > On 6/17/19 7:46 PM, Manu wrote:
> >> Is this valid?
> >>
> >> int x;
> >> void fun(scope ref shared(int) x) { ... }
> >> fun(x); // implicit promotion to shared in this case
> >>
> >> This appears to promote a thread-local to shared. The problem with
> >> such promotion is that it's not valid that a thread-local AND a shared
> >> reference to the same thing can exist at the same time.
> >>
> >> With scope, we can guarantee that the reference doesn't escape the
> >> callee.
> >> Since the argument is local to the calling thread, and since the
> >> calling thread can not be running other code at the same time as the
> >> call is executing, there is no way for any code to execute with a
> >> thread-local assumption while the callee makes shared assumptions.
> >>
> >> I think this might be safe?
> >>
> >
> > Seems like it would be safe, but what is the use case for it? If you
> > have a scope shared, which can't actually get shared with anything else,
> > what does it buy you?
> >
> > -Steve
>
> He would write @system code that leaks the reference to other threads
> temporarily, but ensures those references disappear once the parallel
> part of the computation has finished. His use case is @safe parallel
> foreach without having to explicitly qualify the variables in the outer
> scope as `shared`:
>
> void sum(){ // note: just to illustrate the concept
>      int result=0;
>      foreach(i;iota(1000).parallel){
>          static assert(typeof(result)==shared(int));
>          result.atomic!"+="(i);
>      }
>      static assert(typeof(result)==int);
>      return result;
> }

👍

We must get here.



More information about the Digitalmars-d mailing list