Le 14/04/2012 18:04, Russel Winder a écrit : > 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. >
This works: int main ( immutable string[] args ) { auto threadgroup = new ThreadGroup(); void delegate ( ) f (int a ) { return delegate ( ) { writeln ( a ) ; } ; } for ( int n = 0; n < 10; n++ ) { threadgroup.create(f(n)); } threadgroup.joinAll( ); return 0 ; } Threads are tracked by the threadgroup, which knows who can be joined.