Are spawn'ed threads waited automatically?

Ali Çehreli acehreli at yahoo.com
Mon Jun 6 14:37:55 PDT 2011


On 06/06/2011 12:07 PM, Steven Schveighoffer wrote:
> On Mon, 06 Jun 2011 14:09:25 -0400, Ali Çehreli <acehreli at yahoo.com> wrote:
>
>> First, the answer may be as simple as "use
>> core.thread.thread_joinAll". Is that the proper way of waiting for all
>> threads?
>
> main (the C main, not D main) does this already:
>
> https://github.com/D-Programming-Language/druntime/blob/master/src/rt/dmain2.d#L512
>
>
> But note that "daemonized" threads will not be included:
>
> http://www.digitalmars.com/d/2.0/phobos/core_thread.html#isDaemon
>
> -Steve

Thank you but it doesn't explain the inconsistent behavior. It seems 
like thread_joinAll() has a different idea at different times. Now I 
also print the result of isDaemon():

import std.stdio;
import std.concurrency;
import core.thread;

void tell_daemon_state(string name)
{
     writeln(name, " isDaemon: ", Thread.getThis.isDaemon);
}

void foo()
{
     tell_daemon_state("foo");

     foreach (i; 0 .. 5) {
         Thread.sleep(dur!"msecs"(500));
         writeln(i, " foo");
     }
}

void intermediate()
{
     tell_daemon_state("intermediate");

     spawn(&foo);
     writeln("intermediate done");
}

void main()
{
     tell_daemon_state("main");

     spawn(&intermediate);
     writeln("main done");
}

I see that only the main thread is a daemon:

main isDaemon: true
main done
intermediate isDaemon: false
intermediate done
foo isDaemon: false
0 foo
1 foo
2 foo
3 foo
4 foo

That makes sense.

There is a race condition: Just because I added the printing of the 
isDaemon state, now foo() runs to completion seemingly everytime I start 
the program. When I remove the printing AND run the program under 
'time', I get inconsistent behavior.

The following are two consecutive runs:

$ time ./deneme
main done
intermediate done
0 foo                    <--- foo()'s output is present
1 foo
2 foo
3 foo
4 foo

real	0m2.504s
user	0m0.000s
sys	0m0.000s

$ time ./deneme
main done
intermediate done        <--- foo()'s output is missing

real	0m0.003s
user	0m0.000s
sys	0m0.000s

As if thread_joinAll() misses the fact that there is still the 
non-daemon foo() thread.

Note that it's not failing to flush stdout either. The program runs 
shorter in the case where foo()'s output is missing.

Thank you,
Ali


More information about the Digitalmars-d-learn mailing list