BUG: _wsetlocale Is Not Threadsafe

Article translations Article translations
Article ID: 304497 - View products that this article applies to.
This article was previously published under Q304497
Expand all | Collapse all

On This Page


A heap corruption can occur if _wsetlocale is called simultaneously from multiple threads.


_wsetlocale does not synchronize access to a local static variable, outwlocale.


To work around this, you must synchronize calls to _wsetlocale.


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


The C Runtime locale mechanism in Microsoft Visual C++ is distinct from the locale mechanism in Microsoft Windows. Though Windows supports per-thread locales, C Runtime supports only a single global locale for any program.

If multiple threads call _wsetlocale, then no thread's locale can be trusted. For example, if one thread calls _wsetlocale for French and tries to use that locale for _wcslwr, and another thread calls _wsetlocale for English before the first thread executes the _wcslwr function call, then the first thread uses the English locale instead of the French locale.

Steps to Reproduce the Behavior

#define _UNICODE
#include <stdio.h>
#include <locale.h>
#include <process.h>

void __cdecl test(void *i) {
	_wsetlocale(LC_ALL, L"English");
	_wsetlocale(LC_ALL, L"French");
	_wsetlocale(LC_ALL, L"German");
	_wsetlocale(LC_ALL, L"English");
	printf("%d exit\n",i);

void wmain () {
	for (int i=0; i<30; ++i) _beginthread(test,0,(void*)i);


Article ID: 304497 - Last Review: October 22, 2002 - Revision: 1.0
  • Microsoft Visual C++ 6.0 Service Pack 5
kbbug kbfix KB304497
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

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