This article is from the Threads Programming FAQ, by Bryan O'Sullivan firstname.lastname@example.org with numerous contributions by others.
If some piece of code is described as MT-safe, this indicates that it
can be used safely within a multithreaded program, "and" that it
supports a "reasonable" level of concurrency. This isn't very
interesting; what you, as a programmer using threads, need to worry
about is code that is "not" MT-safe. MT-unsafe code may use global
and/or static data. If you need to call MT-unsafe code from within a
multithreaded program, you may need to go to some effort to ensure
that only one thread calls that code at any time.
Wrapping a global lock around MT-unsafe code will generally let you
call it from within a multithreaded program, but since this does not
permit concurrent access to that code, it is not considered to make it
If you are trying to write MT-safe code using POSIX threads, you need
to worry about a few issues such as dealing correctly with locks
across calls to fork(2) (if you are wondering what to do, read about
the pthread_atfork(3) library call).