[dmd-concurrency] draft 7

Robert Jacques sandford at jhu.edu
Mon Feb 1 13:02:52 PST 2010


On Mon, 01 Feb 2010 15:30:47 -0500, Andrei Alexandrescu  
<andrei at erdani.com> wrote:
> Michel Fortin wrote:
>>> The program would compile successfully with the following changes
>>> to nyukNyuk and sneaky:
>>>  shared(double)* nyukNyuk; // or: shared(double*) nyukNyuk; void
>>> sneaky(ref shared(double) r) { nyukNyuk = &r; }
>>  How can that be safe? Leaking the reference, even as 'shared',
>> doesn't prevent someone from accessing the variable without acquiring
>> the lock. Are you suggesting that mixing atomic operations and mutex
>> synchronization for the same variable is okay? Because it's not.
>
> You are making a good point. I thought of banning escapes altogether.  
> After all, if someone has access to a shared data member and the  
> synchronized method assumes it can temporarily optimize access to that  
> member as if it's unshared, things can get messed up.
>
> On the other hand, if you hand out a reference to a member, you're kind  
> of setting yourself up for surprises. Far as the type system is  
> concerned, it's doing the right thing.
>
> One related thought: a long time ago, Walter, Bartosz and I briefly  
> coquetted with the idea of using "scope" to denote an unescaping  
> parameter:
>
> void print(scope int[] array) { ... }
>
> With this signature print guarantees it won't escape anything in array.  
> Then synchronized functions can pass (addresses of) members to functions  
> like print.
>
> It's not an easy feature to implement though.

What's difficult to implement specifically? Full escape analysis is  
difficult, but you can provide the same guarantees by being a bit  
conservative. In essence, by removing the assignment operator, except at  
declaration, you can prevent escapes. This does necessitate the creation  
of a new, transitive type (lent), but doesn't seem difficult to implement.  
Indeed, final was proposed a while back (during the const debates) to  
behave in mostly the same way (except not transitively). Although it is a  
bit long in the tooth now, I did write out a proposal, fleshing these  
ideas out: http://prowiki.org/wiki4d/wiki.cgi?OwnershipTypesInD.


More information about the dmd-concurrency mailing list