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