[dmd-concurrency] tail-shared by default?
    Steve Schveighoffer 
    schveiguy at yahoo.com
       
    Fri Jan  8 19:43:38 PST 2010
    
    
  
----- Original Message ----
> From: Walter Bright <walter at digitalmars.com>
> 
> All that's necessary is to take the address of a shared local and pass it to 
> another thread:
> 
>   void foo()
>   { shared int x;
>      passToAnotherThread(&x);
>      x++;     // <=== synchronization issues!
>      waitForThreadToFinish();
>    }
> 
In my scheme the declaration of x above is illegal.  You cannot share stack data.
Even if you have:
void foo()
{
   shared int * x; // ok, equivalent to shared(int)*
   passToAnotherThread(&x); // error, &x is shared(int)**, cannot convert to shared (int *)*
}
basically, it's impossible to have a fully shared local variable, all shared local variables are tail-shared.  The only place fully shared data can be is global data or the heap.  This is in essence exactly how it should be -- you are not sharing the pointer that you copy onto the stack, you are sharing what it points to.
-Steve
      
    
    
More information about the dmd-concurrency
mailing list