[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