Very limited shared promotion

Walter Bright newshound2 at digitalmars.com
Wed Jun 19 09:13:46 UTC 2019


On 6/17/2019 4: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?
> 

Using the resulting value of x:

   int x;
   void fun(scope ref shared(int) x) { ... }
   fun(x); // implicit promotion to shared in this case
   int y = x; // add this line

And now there's a problem. The compiler thinks x is thread local, so it doesn't 
add synchronization to the read of x. Not adding synchronization means that 
although fun() has terminated all the threads it spawned accessing x, it does 
not mean the memory caches of x are updated.

While you may have coded fun() to update the caches of x before returning, the 
compiler can't know that, and so the compiler cannot allow the implicit conversion.

In other words, adding `scope` does not guarantee SC-DRF (Sequential Consistency 
- Data Race Free).


More information about the Digitalmars-d mailing list