std.concurrent Tid vector initialization problem

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jul 1 02:19:21 PDT 2015


On Tuesday, 30 June 2015 at 19:19:43 UTC, Charles Hixson wrote:
> On Sunday, 28 June 2015 at 09:59:29 UTC, Marc Schütz wrote:
>> On Sunday, 28 June 2015 at 01:02:02 UTC, Charles Hixson wrote:
>>> I'm planning an application where a series of threads each 
>>> ...gn.  Does anyone have a better idea?
>>>
>>> (The rough estimate of the number of Tids is six, but that's 
>>> likely to change from run to run.)
>>
>> The most elegant solution I can think of is this:
>>
>> struct Go { }
>>
>> __gshared const Tid[] allTids;
>>
>> void myfunc(...) {
>>     receiveOnly!Go();
>>     // do the work
>> }
>>
>> shared static this() {
>>     Tid[] tids;
>>     foreach(thread; threads)
>>         tids ~= spawn(&myfunc, ...);
>>     *cast(const(int)[]*) &allTids = tids;
>>     foreach(tid; allTids)
>>         tid.send(Go());
>> }
>>
>> I believe the cast is not even undefined behaviour, because 
>> it's not immutable, but I'm not sure. But the const-ness 
>> guards against accidental modification of `allTids` by a 
>> thread.
>>
>> Alternatively, you could make `allTids` private, provide a 
>> public getter, and implement the threads in another module.
>>
>> Or you could simply leave the global array mutable and be 
>> careful not to modify it.
>
> Thanks.  That sounds similar to the approach that I had though 
> of, except that you're doing it in a static this().
>
> (I'd have answered sooner, but my D email seems to have died.  
> Only the D groups are currently dead now, though my entire 
> account was dead for a couple of weeks.  [AT&T])

That `shared static this` isn't really necessary here. I 
originally had an immutable `allTids`, for which it was necessary.


More information about the Digitalmars-d-learn mailing list