Thread-safe attribution

Stefan Koch uplink.coder at googlemail.com
Mon Oct 8 15:32:28 UTC 2018


On Sunday, 7 October 2018 at 02:59:12 UTC, Manu wrote:
> On Sat, Oct 6, 2018 at 7:40 PM Nicholas Wilson via 
> Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>>
>> [...]
>>
>> One thing that occurred to me is that _objects_ are shared, 
>> whereas _functions/methods_ (and their parameters) are thread 
>> safe .
>>
>> Theadsafe is kind of like a const (as to mutable/immutable) to 
>> threading, a promise to behave correctly in the presence of 
>> threading. thread safe references therefore must not escape.
>
> Right, that's kinda what I want to model... but the more I 
> think of it, the more I think that experience can fit into 
> `shared`, because it's almost there, and the current 
> incarnation of shared is objectively useless.
>
> Consider shared as is today;
> struct Bob
> {
>   int x;
>   void f() shared
>   {
>     x = 10; // <- this compiles... WAT?!
>   }
> }
>
> Right now, if you have a shared instance, you can read/write to 
> the
> members... and that makes *absolutely no sense* no matter how 
> you look
> at it.
> There is no reality where you have a shared thing, and accessing
> members un-controlled can be safe.
>
> Conventional wisdom is that when you have a shared thing, and 
> you want
> to do stuff with it, you must acquire locks (or whatever) and 
> case
> shared away. That should apply to f() above.
>
> struct Bob
> {
>   int x;
>   void f() shared
>   {
>     auto lock = getLock();
>     auto unshared = shared_cast(&this);
>     unshared.x = 10; // <- this is now okay.
>   }
> }
>
> If we made a change were `shared` lost the ability to access 
> non-`shared` members, I don't think that would interfere with 
> current or proposed uses of shared in any way whatsoever... and 
> we would make shared useful in the process.

I think it should be more like this
shared struct Bob
{
     shared int x;
     void f() shared
     {
       Laquire:
       auto owned_bob = try_aquire(&this, pthread_self());
       // type will be the same as Bob* but without shared 
stripped from variables
       // and without any functions
       if (owned_bob is null)
       {
           __mmPause();
           goto Laquire;
       }
       *owned_bob.x = 10;
     }

}


More information about the Digitalmars-d mailing list