Library Support for Multithreading
| Overview | How Do I | Sample
If one thread is suspended by the Win32 scheduler while executing the printf function, one of the program’s other threads might start executing. If the second thread also calls printf, data might be corrupted. To avoid this situation, access to static data used by the function must be restricted to one thread at a time.
You do not need to serialize access to stack-based (automatic) variables because each thread has a different stack. Therefore, a function that uses only automatic (stack) variables is reentrant. The standard C run-time libraries, such as LIBC, have a limited number of reentrant functions. A multithread program needing to use C run-time library functions that are normally not reentrant should be built with the multithread library LIBCMT.LIB.
The Multithread C Libraries: LIBCMT.LIB and MSVCRT.LIB
The support library LIBCMT.LIB is a reentrant library for creating multithread programs. The MSVCRT.LIB library, which calls code in the shared MSVCRT40.DLL, is also reentrant. When your application calls functions in these libraries, the following rules may apply:
All library calls must use the C (__cdecl) calling convention; programs compiled using other calling conventions (such as __fastcall or __stdcall) must use the standard include files for the run-time library functions they call.
Variables passed to library functions must be passed by value or cast to a pointer.
Programs built with LIBCMT.LIB do not share C run-time library code or data with any dynamic-link libraries they call.
Alternatives to LIBCMT.LIB and MSVCRT.LIB
If you build a multithread program without using LIBCMT.LIB, you must do the following:
Use the standard C libraries and limit library calls to the set of reentrant functions.
Provide your own synchronization for functions that are not reentrant by using Win32 services such as semaphores and the and functions.
Warning The multithread library LIBCMT.LIB includes the _beginthread and _endthread functions. The _beginthread function performs initialization without which many C run-time functions will fail. You must use _beginthread instead of CreateThread in C programs built with LIBCMT.LIB if you intend to call C run-time functions.
The Multithread Libraries Compile Option
To build a multithread application that uses the C run-time libraries, you must tell the compiler to use a special version of the libraries (LIBCMT.LIB). To select these libraries, first open the Project Settings dialog box (Build menu) and click the C/C++ tab. Select Code Generation from the Category drop-down list box. From the Use Run-Time Library drop-down box, select Multithreaded. Click OK to return to editing.
From the command line, the Multithread Library compiler option (/MT) is the best way to build a multithread program with LIBCMT.LIB. This option, which is automatically set when you specify a multithreaded application when creating a new project, embeds the LIBCMT library name in the object file.