D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 6116 - May not join spawn()'ed threads
Summary: May not join spawn()'ed threads
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: x86_64 Linux
: P2 major
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-06-06 16:33 UTC by Ali Cehreli
Modified: 2012-10-19 00:31 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Ali Cehreli 2011-06-06 16:33:09 UTC
Version: 2.053

The command line:

~/dmd2.053/linux/bin64/dmd deneme.d  -ofdeneme  -unittest -J. -w  

Although I have multiple threads spawning each other here, I also had problems with just a single thread spawned from main. I wanted to keep this example as it exposes many different outputs for me.

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

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

void intermediate3()
{
    spawn(&foo);
    writeln("intermediate3 done");
}

void intermediate2()
{
    spawn(&intermediate3);
    writeln("intermediate2 done");
}

void intermediate()
{
    spawn(&intermediate2);
    writeln("intermediate done");
}

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

1) ThreadException:

$ time ./deneme
main done
intermediate done
intermediate2 done
intermediate3 done
core.thread.ThreadException@src/core/thread.d(866): Unable to join thread
----------------
----------------

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

2) No output from foo() (foo() is not joined)

$ time ./deneme
main done
intermediate done
intermediate2 done
intermediate3 done

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

3) Segmentation fault:

$ time ./deneme
main done
intermediate done
Segmentation fault

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

4) Expected behavior:

$ time ./deneme
main done
intermediate done
intermediate2 done
intermediate3 done
0 foo
1 foo
2 foo
3 foo
4 foo
Comment 1 Ali Cehreli 2011-06-06 16:38:06 UTC
Apparently I clipped the timings for the last run. When it joins successfully, the program takes long, seemingly waiting for the foo() thread:

$ time ./deneme
main done
intermediate done
intermediate2 done
intermediate3 done
0 foo
1 foo
2 foo
3 foo
4 foo

real	0m2.504s
user	0m0.000s
sys	0m0.000s
Comment 2 Sean Kelly 2011-07-26 22:53:47 UTC
What's likely happening is that the app is terminating before the new threads actually start, so they aren't marked isRunning when the wait loop occurs.  The fix for this will likely be to add a status field where a thread may be marked as ready, starting, running, and terminated.
Comment 3 SomeDude 2012-04-24 00:49:12 UTC
Run with 2.059 Win32:

PS E:\DigitalMars\dmd2\samples> rdmd bug
main done
intermediate done
intermediate2 done
intermediate3 done
0 foo
1 foo
2 foo
3 foo
4 foo
PS E:\DigitalMars\dmd2\samples>
Comment 4 Ali Cehreli 2012-04-24 06:29:21 UTC
Same here: This bug seems to have been fixed by other changes.
Comment 5 Alex Rønne Petersen 2012-10-19 00:31:01 UTC
Closing this then. Please reopen if the bug resurfaces.