3. Using the C++ Compiler Options
6. Creating and Using Templates
9. Improving Program Performance
10. Building Multithreaded Programs
10.2 Using Exceptions in a Multithreaded Program
10.3 Sharing C++ Standard Library Objects Between Threads
10.4 Using Classic iostreams in a Multithreading Environment
10.4.1 Organization of the MT-Safe iostream Library
10.4.1.1 Public Conversion Routines
10.4.1.2 Compiling and Linking With the MT-Safe libC Library
10.4.1.3 MT-Safe iostream Restrictions
10.4.1.4 Reducing Performance Overhead of MT-Safe Classes
10.4.2 Interface Changes to the iostream Library
10.4.2.2 The New Class Hierarchy
10.5 Memory Barrier Intrinsics
12. Using The C++ Standard Library
13. Using the Classic iostream Library
All libraries shipped with the C++ compiler are multithreading safe. If you want to build a multithreaded application, or if you want to link your application to a multithreaded library, you must compile and link your program with the –mt option. This option passes –D_REENTRANT to the preprocessor and passes –lthread in the correct order to ld. For compatibility mode (–compat[=4]), the –mt option ensures that libthread is linked before libC. For standard mode (the default mode), the -mt option ensures that libthread is linked before libCrun. Use of —mt is recommended as a simpler and less error-prone alternative to specifying the macro and library.
You can check whether an application is linked to libthread or not by using the ldd command:
example% CC -mt myprog.cc example% ldd a.out libm.so.1 => /usr/lib/libm.so.1 libCrun.so.1 => /usr/lib/libCrun.so.1 libthread.so.1 => /usr/lib/libthread.so.1 libc.so.1 => /usr/lib/libc.so.1 libdl.so.1 => /usr/lib/libdl.so.1
The C++ support libraries, libCrun, libiostream, libCstd, and libC are multithread safe but are not async safe. This means that in a multithreaded application, functions available in the support libraries should not be used in signal handlers. Doing so can result in a deadlock situation.
It is not safe to use the following in a signal handler in a multithreaded application:
Iostreams
new and delete expressions
Exceptions