I concluded that this might be a solution. I tested it with 2.0.5 from
ubuntu repository. I had to add GC_allow_register_threads (and link
against gc, accordingly), because otherwise the program aborted with
the message "Threads explicit registering is not previously enabled"
whenever it attempted to create a thread.
For some reason the initialization routine needs to call
scm_c_eval_string; otherwise it doesn't help.
The solution doesn't fill me with joy, but I hope it works for you
#include <libguile.h>
#include <pthread.h>
void *guile_wrapper (void *data) {
scm_c_eval_string ("(display \"Hello\n\")");
return NULL;
}
void *thread_func (void *data) {
scm_with_guile (&guile_wrapper, NULL);
return NULL;
}
void *do_nothing(void *unused) {
scm_c_eval_string("(noop)");
return NULL;
}
int main () {
pthread_t thread1;
pthread_t thread2;
GC_allow_register_threads();
scm_with_guile(do_nothing, NULL);
pthread_create (&thread1, NULL, thread_func, NULL);
pthread_create (&thread2, NULL, thread_func, NULL);
pthread_join (thread1, NULL);
pthread_join (thread2, NULL);
return 0;
}