There are some non-reentrant functions, but they are documented. Most have *_r versions now too. The important things, like malloc and free, are thread safe in any sane libc. It's up to the programmer to coordinate access to non-thread-safe functions. C doesn't hold your hand or wipe your ass; it assumes you're a big boy who knows how threads and memory work.
Locking, even atomics, is expensive. It has to coordinate between all the core' cache's in hardware, which is slow, even if it just looks like you're setting a variable. Locking everywhere all the time just so the programmer can be lazy is dumb in a high performance language.