[Issue 19487] New: Thread never detaches after spawn
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Dec 14 21:20:34 UTC 2018
https://issues.dlang.org/show_bug.cgi?id=19487
Issue ID: 19487
Summary: Thread never detaches after spawn
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: druntime
Assignee: nobody at puremagic.com
Reporter: undefer at gmail.com
Program to test:
#!/usr/bin/rdmd
import std.stdio;
import std.concurrency;
import core.thread;
import core.memory;
void thread()
{
writefln("Thread %s started", thisTid);
Thread.sleep(10.seconds);
writefln("Thread %s finished", thisTid);
}
void main()
{
for (int i=0; i<1000; i++)
{
spawn(&thread);
}
Thread.sleep(13.seconds);
writefln("Collect");
GC.collect();
Thread.sleep(10.seconds);
}
Run as ./threads.d
In other console do:
$ ps -e | grep threads
$ cat /proc/[PID]/maps | wc -l
It shows count of maps like 2479.
After "Collect" must be something like 243.
But it doesn't happen, because in the class Thread:
~this() nothrow @nogc
{
bool no_context = m_addr == m_addr.init;
bool not_registered = !next && !prev && (sm_tbeg !is this);
if (no_context || not_registered)
{
return;
}
And after finishing of the thread it is always not_registered. Before finishing
the thread the dtor can't be run, because it is registered.
--
More information about the Digitalmars-d-bugs
mailing list