[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