_configthreadlocale
Configures per-thread locale options.
int _configthreadlocale(
int type
);
Parameters
- type
The option or options to set. One of the options listed in the following table.
Return Value
The previous per-thread locale status (_DISABLE_PER_THREAD_LOCALE or _ENABLE_PER_THREAD_LOCALE), or -1 on failure.
Remarks
The _configurethreadlocale function is used to control the use of thread-specific locales.
_ENABLE_PER_THREAD_LOCALE
Make the current thread use a thread-specific locale. Subsequent calls to setlocale in this thread affect only the thread's own locale._DISABLE_PER_THREAD_LOCALE
Make the current thread use the global locale. Subsequent calls to setlocale in this thread affect other threads using the global locale.zero
Retrieves the current setting for this particular thread.
These functions affect the behavior of setlocale, _tsetlocale, _wsetlocale, _beginthread, and _beginthreadex. If another method is used to create threads, the locale settings have no affect on those threads.
When per-thread locale is disabled, any subsequent call to setlocale or _wsetlocale changes the locale of all threads. When per-thread locale is enabled, setlocaleor _wsetlocale only affects the current thread's locale. Per-thread locale can be enabled or disabled globally for all threads. When per-thread locale is enabled globally, setlocale or _wsetlocale on any thread (not just the current thread) only affect that thread.
If type is not one of the values listed in the table, this function invokes the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, this function sets errno to EINVAL and returns -1.
Requirements
Routine |
Required header |
---|---|
_configthreadlocale |
<locale.h> |
Example
// crt_configthreadlocale.cpp
//
// This program demonstrates the use of _configthreadlocale when
// using is two independent threads.
//
#include <locale.h>
#include <process.h>
#include <windows.h>
#include <stdio.h>
#include <time.h>
#define BUFF_SIZE 100
// Retrieve the date and time in the current
// locale's format.
int get_time(unsigned char* str)
{
__time64_t ltime;
struct tm thetime;
// Retieve the time
_time64(<ime);
_gmtime64_s(&thetime, <ime);
// Format the current time structure into a string
// using %#x is the long date representation,
// appropriate to the current locale
if (!strftime((char *)str, BUFF_SIZE, "%#x",
(const struct tm*)&thetime))
{
printf("strftime failed!\n");
return -1;
}
return 0;
}
// This thread sets its locale to German
// and prints the time.
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
unsigned char str[BUFF_SIZE];
// Set the thread local
printf("The thread local is now set to %s.\n",
setlocale(LC_ALL, "German"));
// Retrieve the time string from the helper function
if (get_time(str) == 0)
{
printf("The time in German locale is: '%s'\n", str);
}
_endthreadex( 0 );
return 0;
}
// The main thread spawns a second thread (above) and then
// sets the locale to English and prints the time.
int main()
{
HANDLE hThread;
unsigned threadID;
unsigned char str[BUFF_SIZE];
// Configure per-thread locale to cause all subsequently created
// threads to have their own locale.
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
// Retrieve the time string from the helper function
printf("The thread local is now set to %s.\n",
setlocale(LC_ALL, "English"));
// Create the second thread.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc,
NULL, 0, &threadID );
if (get_time(str) == 0)
{
// Retrieve the time string from the helper function
printf("The time in English locale is: '%s'\n\n", str);
}
// Wait for the created thread to finish.
WaitForSingleObject( hThread, INFINITE );
// Destroy the thread object.
CloseHandle( hThread );
}
The thread local is now set to English_United States.1252. The time in English locale is: 'Wednesday, May 12, 2004' The thread local is now set to German_Germany.1252. The time in German locale is: 'Mittwoch, 12. Mai 2004'
.NET Framework Equivalent
Not applicable. However, see Using the CurrentCulture Property.