Threads don’t mix well with signals; multithreaded application designs should avoid the use of signals whenever possible. If a multithreaded application must deal with asynchronous signals, usually the cleanest way to do so is to block signals in all threads, and have a single dedicated thread that accepts incoming signals using sigwait() (or similar). This thread can then safely perform tasks such as modifying shared variables (under mutex control) and calling non-async-signal-safe functions.
Two threading implementations are commonly available on Linux: LinuxThreads and NPTL. LinuxThreads has been available on Linux for many years, but there are a number of points where it doesn’t conform to the requirements of SUSv3 and it is now obsolete. The more recent NPTL implementation provides closer SUSv3 conformance and superior performance, and is the implementation provided in modern Linux distributions.
Refer to the sources of further information listed in Summary.
The author of LinuxThreads documented the implementation in a web page that can be found at http://pauillac.inria.fr/~xleroy/linuxthreads/. The NPTL implementation is described by its implementers in a (now somewhat out-of-date) paper that is available online at http://people.redhat.com/drepper/nptl-design.pdf.