[Issue 318] New: wait does not release thread resources on Linux

Sean Kelly sean at f4.ca
Sat Sep 2 12:24:51 PDT 2006


d-bugmail at puremagic.com wrote:
> http://d.puremagic.com/issues/show_bug.cgi?id=318
> 
>            Summary: wait does not release thread resources on Linux
>            Product: D
>            Version: 0.165
>           Platform: All
>         OS/Version: Linux
>             Status: NEW
>           Severity: blocker
>           Priority: P2
>          Component: Phobos
>         AssignedTo: bugzilla at digitalmars.com
>         ReportedBy: mclysenk at mtu.edu
> 
> 
> While wait is supposed to release a thread's resources, it will fail if the
> thread has already completed.  This makes it impossible to use more than 400
> threads reliably.  Here is an example which demonstrates the problem:
> 
> 
> import std.stdio, std.thread;
> 
> void main()
> {
>     for(int i=0; i<80000; i++)
>     {
>         writefln("Creating thread %d", i);
>         Thread t = new Thread({writefln("    Created!"); return 0;});
>         t.start;
>         for(int x=0; x<1000; x++)
>             Thread.yield;
>         t.wait;
>         writefln("    Finished.");
>     }
> }
> 
> 
> Within a few hundred iterations, this code will likely produce a "failed to
> start" error.  From my testing, this issue only affects Linux.

I think line 667 of thread.d should be changed from:

   if (state == TS.RUNNING)

to:

   if (state != TS.INITIAL)

Because it is not only legal to call pthread_join on a thread that has 
run and finished, but calling pthread_join or pthread_detach is required 
for the thread resources to be released.  However, it is illegal to call 
pthread_join more than once, and I believe it is also illegal to detach 
a thread that has already been joined, so 'id' should probably be 
cleared after join/detach is called, and this value tested along with 
'state' before performing thread ops.

As an unrelated issue, I just noticed that CloseHandle is not being 
called on the thread handle for Win32, and pthread_detach is not being 
called for Posix.  I think this should be done in a thread dtor or the 
equivalent to ensure resources are properly released.


Sean



More information about the Digitalmars-d-bugs mailing list