Very limited shared promotion

Manu turkeyman at gmail.com
Wed Jun 19 03:25:42 UTC 2019


On Wed, Jun 19, 2019 at 1:24 PM Manu <turkeyman at gmail.com> wrote:

> 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.
>

The delegate is effectively a prototype for the lambda, it should be used
verbatim.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20190619/533ad856/attachment.html>


More information about the Digitalmars-d mailing list