Very limited shared promotion
Manu
turkeyman at gmail.com
Wed Jun 19 03:24:57 UTC 2019
On Wed, Jun 19, 2019 at 1:15 PM Exil via Digitalmars-d <
digitalmars-d at puremagic.com> wrote:
> On Wednesday, 19 June 2019 at 03:02:30 UTC, Manu wrote:
> > 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.
>
> How is it to know it is supposed to be shared though? opApply is
> already kind of a disaster with attributes.
>
opApply receives a delegate; you would infer the delegate qualifier to the
lambda as it already does for the loop counters from the arguments.
Ie:
opApply(scope void delegate() shared) <- infer the shared qualifier to the
foreach body lambda.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20190619/8aaa6a69/attachment.html>
More information about the Digitalmars-d
mailing list