FIX: Exception When Calling strftime() Function

Article translations Article translations
Article ID: 193509 - View products that this article applies to.
This article was previously published under Q193509
This article has been archived. It is offered "as is" and will no longer be updated.
Expand all | Collapse all

SYMPTOMS

Multithreaded applications may experience exceptions or incorrect results when calling the C run-time library (CRT) strftime() function. This behavior is particularly prevalent on multiprocessor machines.

CAUSE

The strftime() function is dependent on an internal pointer for locale- related information that is necessary for formatting time and date strings. This pointer is used, and can be modified, by other components of the CRT, but is not protected for exclusive use within the strftime() function. This allows other threads to modify the pointer while strftime() is using it.

RESOLUTION

The internal pointer is modified when calling the setlocale() CRT function. To prevent the pointer from being inadvertently modified while being used, use one of the following two workarounds:
  • Call setlocale once before other threads are created.
  • Synchronize access to functions that use locale information.

STATUS

Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article.

This bug has been fixed in the Visual Studio 6.0 Service Pack 1. To obtain this service pack, please see:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
For more information on the Visual Studio 6.0 Service Pack 1, please see the following articles in the Microsoft Knowledge Base:
193009 INFO: Visual Studio 6.0 Service Pack 1 Readme

194022 INFO: Visual Studio 6.0 Service Pack 1 What, Where, Why
194295 HOWTO: Tell that Visual Studio 6.0 Service Packs Are Installed

MORE INFORMATION

The following sample program reproduces an exception. For multiprocessor systems, the problem occurs almost immediately:
   // Compile /MT or /MD

   #include <process.h>
   #include <time.h>
   #include <locale.h>

   void work( void* pArg ) // This uses the locale info pointer.
   {
        char        str256[256];
        time_t      t;
        struct tm*  ptm;

    t = time(0);
    ptm = localtime( &t );
    for (;;) strftime( str256, 256, "%a%b%c%d%x%y", ptm );

   }

   void main()
   {
     _beginthread( work, 0, 0 );

     for(;;) // This changes the locale info pointer.
        {
        setlocale(LC_ALL,"english");
        setlocale(LC_ALL,"german");
        setlocale(LC_ALL,"french");
        setlocale(LC_ALL,"spannis");
        setlocale(LC_ALL,"russian");
        }
    }
				

Properties

Article ID: 193509 - Last Review: February 28, 2014 - Revision: 2.1
APPLIES TO
  • Microsoft Visual C++ 6.0 Professional Edition
Keywords: 
kbnosurvey kbarchive kbbug kbcrt kbfix kbvs600sp1fix kbvs600sp2fix KB193509

Give Feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com