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

SYMPTOMS

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

CAUSE

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

RESOLUTION

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

STATUS

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

MORE INFORMATION

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);
	getchar();
}
				

Properties

Article ID: 304497 - Last Review: October 22, 2002 - Revision: 1.0
APPLIES TO
  • Microsoft Visual C++ 6.0 Service Pack 5
Keywords: 
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