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

Reply via email to