It's not true that libpd heavily uses pthread_mutex. The libpd layer doesn't use mutexes at all; synchronization of libpd calls is left to the code that libpd is embedded into, as Rich explained.

I suppose you grepped through the code and found a few instances of pthread_mutex in the underlying Pd code. Most of them are in the soundfiler object, which uses pthreads internally; this has nothing to do with the public interface of libpd.

The only other instance of pthread_mutex is Pd's sys_mutex, and libpd deliberately discards that one because sys_mutex solves few problems and has tremendous potential for misuse. If you look at the original libpd paper as well as some of the early discussions at Pd Everywhere, you'll find more background on this.

The upshot is, there's no synchronization in libpd, for very good reasons.