Difference between __gshared and shared.

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Wed Jul 8 06:57:39 PDT 2015


On Wednesday, 8 July 2015 at 12:51:02 UTC, Dmitry Olshansky wrote:
> On 08-Jul-2015 15:39, wobbles wrote:
>> On Wednesday, 8 July 2015 at 12:21:22 UTC, Jonathan M Davis 
>> wrote:
>>> On Wednesday, 8 July 2015 at 11:02:19 UTC, Márcio Martins 
>>> wrote:
>>>> [...]
>>
>>
>> Interesting, so the main pain of using shared is the 
>> requirement to cast
>> away the shared whenever you want to work on the data in a 
>> synchronized
>> block.
>>
>> Is there any links do you know to the old conversations on what
>> solutions are there for this?
>>
>> My first thought is using the 'with' keyword.
>> shared int mySharedInt;
>> synchronised(mutexObj) with (mySharedInt){
>>      // any references to mySharedInt in this block are 
>> implicitly
>> converted to non-shared
>> }
>
> It's good convention but still convention - who guarantees that 
> the right mutex was locked? The locking protocol is outside of 
> the competence of the compiler.

Yes. That's the problem, and it would be great if we could find a 
solution for it. But as annoying as it is, we're still better off 
than what you get with C++.

> However there are synchronized _class_-es that might play nice 
> with shared b/c very access to them is guarded by built-in 
> mutex.

Yes. If synchronized classes were actually implemented, then that 
provides a compiler guaranteed safe way to strip off the outer 
layered of shared, but it only strips off the outer layer (since 
it can't guarantee that stripping off anymore would be safe), 
which would severely limit its usefulness, and it's rather clunky 
and verbose to have to declare whole classes just to operate on 
shared data. So, thus far, it's the best that we've come up with 
for safely casting away shared in a compiler-guaranteed way, but 
it's still not all that great, and it's not even implemented.

So, ultimately, even if we finally do get synchronized classes, I 
expect that there will be a fair bit of code that's going to have 
to rely on the programmer to correctly and safely cast away 
shared to operate on data, as unappealing as that may be.

Regardless, until we have synchronized classes or another 
solution which does something similar, the idiom that I described 
is pretty much what we have to do, even if it unfortunately 
relies on the programmer following convention and being careful. 
But it is basically what you have to do in languages like C++ 
anyway except that casting is involved, and the portion of the 
code where it's necessary is a lot clearer thanks to the fact 
that shared objects are explicitly shared and how shared doesn't 
allow you to do much.

- Jonathan M Davis


More information about the Digitalmars-d mailing list