Shared object must have synchronized interface?
Domain
dont_email at empty.com
Sat May 11 21:34:48 PDT 2013
On Sunday, 12 May 2013 at 03:44:16 UTC, Jonathan M Davis wrote:
> On Sunday, May 12, 2013 04:54:25 Domain wrote:
>> class A
>> {
>> public synchronized void test1()
>> {
>> }
>>
>> public void test2()
>> {
>> }
>> }
>>
>> int main(string[] argv)
>> {
>> auto a1 = new shared(A)();
>> a1.test1();
>> a1.test2();
>>
>> auto a2 = new A();
>> a2.test1();
>> a2.test2();
>> }
>>
>> Error: function main.A.test2 () is not callable using argument
>> types () shared
>> Error: function main.A.test1 () shared is not callable using
>> argument types ()
>>
>> So, if I want a class support both shared and non-shared, I
>> must
>> override all method?
>
> Overload technically, but yes (override means implementing the
> same function
> that was in a base class with the same signature (save perhaps
> for a covariant
> return type), whereas overload means providing a function with
> the same name
> but a different signature).
>
> I believe that the way that shared objects are typically
> handled at this point
> is that if you want to call functions on them, you protect them
> within a
> synchronized block or with a mutex, and then you cast them to
> non-shared while
> you use it (and treat it as shared again once you've exited the
> synchronized
> block or unlocked the mutex). Actually trying to call functions
> on a shared
> object is a royal pain precisely because you have to overload
> everything. But
> as long as access to the object is appropriately protected,
> it's perfectly
> safe to cast the object to non-shared in order to use it. You
> just have to
> make sure that access to the object is indeed protected so that
> only one
> thread is accessing it while it's being operated on as
> non-shared (or you'll
> get really nasty bugs).
>
> A class with synchronized functions can be used to protect a
> shared object,
> but the functions being called on the shared object would still
> have to be
> shared (or the shared object would have to be non-shared) in
> order to call
> them.
>
> - Jonathan M Davis
Thanks for the explanation. Yes, I mean overload. I know the
difference, sorry for my pool English.
Sure, we can use synchronized block instead of synchronized
function. But it's inconvenient. Why not the compiler
automatically convert the non-synchronized function to
synchronized function when the object declare as shared?
More information about the Digitalmars-d-learn
mailing list