How are theads, Tid and spawn related?

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Nov 2 14:34:35 PST 2014


On 11/02/2014 09:04 AM, Sean Kelly wrote:

 > On Sunday, 2 November 2014 at 06:23:38 UTC, Ali Çehreli wrote:

 >> Can I safely remove thread_joinAll()s if they are the last lines in
 >> main()?
 >
 > It has always been the case.  In fact, I have a comment in the body of
 > Thread.start() explaining this potential race and explaining the need
 > for certain operations in that function.

I've grepped for thread_joinAll calls in my examples and identified two 
cases where I needed it at the end of main, both of which about the need 
to "pull" thread_joinAll inside main's scope. Otherwise, the automatic 
thread_joinAll call would happen after main's scope ends and it would be 
too late in the following cases.

1) A scope(exit) should not unregister() before all threads finish.

2) A thread still uses an object tied to main's scope.

void main()
{
     auto first = spawn(&player, "second");
     register("first", first);
     scope(exit) unregister("first");  // <-- (1)

     // ...

     immutable(int) i = 42;
     spawn(&worker, &i);               // <-- (2)

     // ...

     thread_joinAll();                 // <-- justified
}

The thread_joinAll() at the end of main() above is justified to take 
care of both of those cases.

Ali



More information about the Digitalmars-d-learn mailing list