On 14-04-2012 18:04, Russel Winder wrote:
I thought the following would terminate gracefully having printed 0..9
in some (random) order:

         #! /usr/bin/env rdmd

         import std.algorithm ;
         import std.range ;
         import std.stdio ;
         import core.thread ;

         int main ( immutable string[] args ) {
           auto threads = map ! ( ( int a ) {
               void delegate ( ) f ( ) {
                 return delegate ( ) { writeln ( a ) ; } ;
               }
               return new Thread ( f )  ;
             } ) ( iota ( 10 ) ) ;
           foreach ( t ; threads ) { t.start ( ) ; }
           foreach ( t ; threads ) { t.join ( ) ; }
           return 0 ;
         }

However, this does not happen, at least with 2.059 on Linux as per
Debian Unstable.  Instead I get:

         1
         2
         4
         5
         8
         3
         7
         6
         9
         0
         core.thread.ThreadException@src/core/thread.d(906): Unable to join 
thread
         ----------------
         
/tmp/.rdmd-1000/home/users/russel/Progs/OddsByLanguage/D/Odds/initializingWithAMap.d.9532BBED12C814F25F173A9AEAB96D0D(_Dmain+0x83)
 [0x425edb]
         
/tmp/.rdmd-1000/home/users/russel/Progs/OddsByLanguage/D/Odds/initializingWithAMap.d.9532BBED12C814F25F173A9AEAB96D0D(extern
 (C) int rt.dmain2..main(int, char**).void runMain()+0x17) [0x429bab]
         
/tmp/.rdmd-1000/home/users/russel/Progs/OddsByLanguage/D/Odds/initializingWithAMap.d.9532BBED12C814F25F173A9AEAB96D0D(extern
 (C) int rt.dmain2..main(int, char**).void tryExec(scope void delegate())+0x23) 
[0x42952b]
         
/tmp/.rdmd-1000/home/users/russel/Progs/OddsByLanguage/D/Odds/initializingWithAMap.d.9532BBED12C814F25F173A9AEAB96D0D(extern
 (C) int rt.dmain2..main(int, char**).void runAll()+0x3d) [0x429bf9]
         
/tmp/.rdmd-1000/home/users/russel/Progs/OddsByLanguage/D/Odds/initializingWithAMap.d.9532BBED12C814F25F173A9AEAB96D0D(extern
 (C) int rt.dmain2..main(int, char**).void tryExec(scope void delegate())+0x23) 
[0x42952b]
         
/tmp/.rdmd-1000/home/users/russel/Progs/OddsByLanguage/D/Odds/initializingWithAMap.d.9532BBED12C814F25F173A9AEAB96D0D(main+0xd3)
 [0x4294c3]
         /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd) 
[0x7f1ed17f8ead]
         ----------------

I think I must be having a dumb moment as my reaction continues to be
WTF.


http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_join.3.html#ERRORS

We can rule out these:

EDEADLK: Can't happen with your code.
EINVAL (second case): No other thread is trying to join.
ESRCH: Shouldn't happen since druntime registers threads with libpthread.

So, the first case of EINVAL (thread is not a joinable thread) must be the cause. I have no clue *why* though...

--
- Alex

Reply via email to