Having further investigated, I'm convinced that this is a bug. Attached are two minimal C programs. Both create threads that do nothing but sleep for 2 seconds and then exit. The parent tries to join with the child thread, with a timeout of 10 seconds. The only difference is that test1 uses scm_spawn_thread, and test2 uses scm_call_with_new_thread. test1 always times out, and test2 works properly. Having looked at the code in threads.c, I'm surprised that either of them work. Both scm_spawn_thread and scm_call_with_new_thread arrange for pthread_detach to be called in the child (in spawn_thread and launch_thread, respectively). This is supposed to make the child un-joinable. I've attached not only test1.c and test2.c, but also the diff between them. I compiled them as follows: gcc -o test1 test1.c $(pkg-config --cflags --libs guile-2.0) gcc -o test2 test2.c $(pkg-config --cflags --libs guile-2.0) Any ideas? Thanks, Mark