This works, pthread_mutex_t gp_gc_lock = PTHREAD_MUTEX_INITIALIZER; void gp_no_gc() { printf("lock\n"); pthread_mutex_lock(&gp_gc_lock); gp_gc_p ++; pthread_mutex_unlock(&gp_gc_lock); printf("unlock\n"); } void gp_do_gc() { printf("lock\n"); pthread_mutex_lock(&gp_gc_lock); gp_gc_p --; pthread_mutex_unlock(&gp_gc_lock); printf("unlock\n"); } void *gp_after_mark_hook(void *hook_data, void *fn_data, void *data) { SCM pt = scm_fluid_ref(gp_stacks); printf("lock\n"); pthread_mutex_lock(&gp_gc_lock); if(gp_gc_p) { pthread_mutex_unlock(&gp_gc_lock); printf("unlock\n"); return (void *)0; } pthread_mutex_unlock(&gp_gc_lock); printf("unlock\n"); ... But replacing the pthread versions with guile versions of the mutex result in the mutex getting into a locked state without leaving. I sthis a known issue? /Stefan