Microsoft KB Archive/104641

= Description of using C Run-Time (CRT) functions and CreateThread =

Article ID: 104641

Article Last Modified on 4/29/2005

-

APPLIES TO

 The C Run-Time (CRT), when used with:  Microsoft Visual C++ 1.0 Professional Edition

 Microsoft Visual C++ 2.0 Professional Edition

 Microsoft Visual C++ 2.1

 Microsoft Visual C++ 2.2</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 4.1 Subscription</li></ul>

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

 Microsoft Visual C++ 5.0 Standard Edition</li></ul>

 Microsoft Visual C++ 6.0 Service Pack 5</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q104641

<div class="summary_section">

SUMMARY
All C Run-time functions except the signal function work correctly when used in threads that are created by the CreateThread function. However, depending on what CRT functions are called, there may be a small memory leak when threads are terminated. Calling strlen, for example, does not trigger the allocation of the CRT thread data-block, and calling malloc, fopen, _open, strtok, ctime, or localtime causes allocation of a CRT per-thread data-block, which may cause a memory leak.

<div class="moreinformation_section">

MORE INFORMATION
The "Programming Techniques" manual supplied with Visual C++ 32-bit Edition states that using CreateThread in a program that uses Libcmt.lib causes many CRT functions to fail. Actually, the only function that should not be used in a thread created with CreateThread is the signal function.

There are two ways to create threads. One method involves using the CRT _beginthread or _beginthreadex (with Visual C++ 2.0 and later); the other method involves using the CreateThread API. All CRT functions other than the signal function work correctly in threads created with either _beginthread or CreateThread. However, there are some problems involved with using CRT functions in threads created with CreateThread.

Threads that are created and terminated with the CreateThread and ExitThread Win32 API functions do not have memory that is allocated by the CRT for static data and static buffers cleaned up when the thread terminates. Some examples of this type of memory are static data for errno and _doserrno and the static buffers used by functions such as asctime, ctime, localtime, gmtime, and mktime. Using CreateThread in a program that uses the CRT (for example, links with LIBCMT.LIB) may cause a memory leak of about 70-80 bytes each time a thread is terminated.

To guarantee that all static data and static buffers allocated by the CRT are cleaned up when the thread terminates, _beginthreadex and _endthreadex should be used when creating a thread. The _beginthreadex function includes the same parameters and functionality as CreateThread.

Note It is not possible to terminate a thread with _endthreadex when it was created with CreateThread.

Keywords: kbhowto kbinfo KB104641

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.