No.
He means that there are no thread safe *functions*
which access non global data.
Functions which access global data must actually be threaded --
they must use a thread library which guarantees "mutual exclusion"
while they are modifying the global variables
and/or they must use threaded library functions
which use mutual exclusion when modifying global variables.
I'm writing multithreaded applications and libraries since 1988. No,
not the flaky linux threading. Real, kernel based threading. I have
written thousends of functions handling global data, handling static
data, sending pointers around from thread to thread, receiving
pointers in multiwindow, multiproces, multithreaded applications
flawless.
Having multithreading that handles threads better than linux handles
processes makes it much easier to control the flow as you would know
that any of your thread can be interrupted by another thread even
while it is insinde a single C instruction.
Having an OS that gives you many varied APIs to get that under control
makes it really easy. Have the chance to block thread change for
limited time in a single process, variant types of semaphores and
other technics to control the program flow makes it easy to spread new
threads, block access to variables, block access to code, to devices,
to shared memory and so on makes interthread and interprocess
communication easy.
Letting the OS handle not only process but thread scheduling gives you
more control about threads as pthreads ever can reach. Sure, you needs
a thread aware standard C library - but any C compiler can deliver it.
No need to waste one single second on that other than to define the
right linker flags for that. Select the right blocking mechanism and
you can acces global and static variables and even use nonreentrant
functions in your multithreaded environment.