Shared an non-shared

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Oct 4 13:07:03 PDT 2016


On 10/04/2016 09:22 PM, Begah wrote:
> I seem to be missing something.
> It seems that if you want to create a shared object of a structure ( or
> class ), then I have to copy every functions and add "shared" to it.
> This seems way more work than it should.
> For example why can't this simply work :
>
>   class Image {
>     string name;
>     int contents;
>
>     this(string name, int contents) {
>         this.name = name;
>         this.contents = contents;
>     }
>
>     void printContents() {
>         writeln(name, " : ", contents);
>     }
>
>     void changeContents(int newContents) {
>         this.contents = newContents;
>     }
>   }
>
>   void main()
>   {
>     Image im = new Image("Test", 15);
>     im.printContents();
>     im.changeContents(45);
>     im.printContents();
>
>     shared Image imShared = new shared Image("Test2", 80);
>     imShared.printContents();
>     imShared.changeContents(6);
>     imShared.printContents();
>   }

Non-`shared` methods are not required to be somehow thread-safe at all. 
So they can't be allowed to be called on `shared` objects.

The compiler can't automatically ensure thread-safety, because it can't 
know what can run in parallel and what can't.

> How can I make a method that accepts being called by both a shared and
> non-shared object, to prevent having to copy methods and adding a "shared"?

I would have thought that you can call a shared method on an unshared 
object. Apparently not. There's probably a reason for that, but I don't 
see it at the moment.

> I am not looking for an explanation for how to handle multi-threading (
> synchronization and so on ). I am looking to use pre-coded classes and
> structures ( without using __gshared ) with non-shared and shared objects.

Ensure thread-safety and cast `shared` away.


More information about the Digitalmars-d-learn mailing list