Synchronized Classes and Struct Members
Gor Gyolchanyan
gor.f.gyolchanyan at gmail.com
Tue Oct 25 05:33:06 PDT 2011
Yes. The shared-ness, const-ness or immutable-ness of the _this_
parameter is defined by marking the method itself shared, const or
immutable respectively.
But marking the method shared or immutable makes that method callable
_ONLY_ for shared or immutable objects of that class or struct
respectively.
In order to make that struct usable from both shared and non-shared
contexts, you need to have 2 overloads of that method: shared and
non-shared.
On Tue, Oct 25, 2011 at 4:22 PM, Timon Gehr <timon.gehr at gmx.ch> wrote:
> On 10/25/2011 08:36 AM, Andrew Wiley wrote:
>>
>> On Tue, Oct 25, 2011 at 1:26 AM, Benjamin Thaut <code at benjamin-thaut.de
>> <mailto:code at benjamin-thaut.de>> wrote:
>>
>> Am 25.10.2011 08:06, schrieb Andrew Wiley:
>>
>> Geez, I try to write some multithreaded code and I just keep
>> hitting these:
>> --------
>> module test3;
>>
>> struct SomeData {
>> int i;
>> int iPlus2() {
>> return i + 2;
>> }
>> }
>>
>> synchronized class Bob {
>> private:
>> SomeData _dat;
>> public:
>> this() {
>> _dat.i = 3;
>> }
>> @property
>> int i() {
>> return _dat.iPlus2(); // test3.d(22): Error: function
>> test3.SomeData.iPlus2 () is not callable using argument types ()
>> shared
>> }
>> }
>> --------
>>
>> This seems like it should be legal because SomeData is a value
>> type.
>> Accessing _dat.i directly is legal, and _dat can't possibly be
>> shared.
>> If I'm understanding things correctly, transitive shared
>> shouldn't apply
>> to value types like this, so the type of "this" when calling iPlus2
>> should just be SomeData.
>>
>>
>> It can't be garantueed that a pointer to _dat is not given away at
>> some point in the program. For example you could have a clas Foo
>> that inherits from Bob and has a getter for _dat. Then it wouldn't
>> be correct anymore to sasume _dat is unshared. Because of that it
>> has been decided that trying to figure out if _dat has to be shared
>> or not will not happen, thus its just shared always. I've already
>> reported this some time ago and essentially it makes synchronized
>> classes useless for me. I usually just write a normal class and but
>> the synchronized blocks in myself. Also I use __gshared ;-)
>>
>>
>> Alright, but why can I access _dat.i without synchronization?
>
> _dat.i is shared by transitivity. You can access shared variables without
> synchronization (according to TDPL, memory barriers are inserted
> automatically, but I don't know if DMD implements this). SomeData.iPlus2's
> implicit 'this' parameter is not shared.
>
More information about the Digitalmars-d
mailing list