Does anyone understand how to use "shared" types with concurrency send/receive functions?

Arek via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Aug 16 12:55:50 PDT 2017


On Tuesday, 15 August 2017 at 21:54:23 UTC, Steven Schveighoffer 
wrote:
> On 8/15/17 5:27 PM, Arek wrote:
>> On Tuesday, 15 August 2017 at 10:37:08 UTC, Kagamin wrote:
>>> Well, no wrapper is actually needed here:
>>>
[...]
> The issue is that send cannot handle shared value types due to 
> a bug in the implementation. In essence, there is no reason to 
> send a shared A -- it's an unrelated copy and not actually 
> shared.
>
> You can send a shared reference to an A just fine:
>
> static shared A a;
>
> send(tid, &a); // works
>
> You *should* be able to send a shared(A). There is no reason to 
> disallow it. But again, it's not super useful.
>
Yes, I absolutely agree. The object may be shared due to other 
requirements and there is no reason to reject 'share' qualifier 
what I want to send/receive it.

>> This very simple code also doesn't compile:
>> 
>> shared struct S
>> {
>>      int i;
>> 
>>      ~this()
>>      {
>>      }
>> }
>> 
>> void main()
>> {
>>      shared s = shared S();
>> }
>> 
>> In general, shared structs with postblit and destructor make 
>> problems.
>
> postblit should work.
>
> It does look like destructors are a problem. It appears the 
> compiler attempts to call the destructor while unshared.
>
> -Steve

But I have no idea how and when the object loses its shared 
nature. Yes, it looks like a bug in dmd. ldc 1.3 doesn't complain 
in this case.

Arek



More information about the Digitalmars-d-learn mailing list