Article ID: 304497 - Last Review: October 22, 2002 - Revision: 1.0

BUG: _wsetlocale Is Not Threadsafe

This article was previously published under Q304497

On This Page

Expand all | Collapse all

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

APPLIES TO
  • Microsoft Visual C++ 6.0 Service Pack 5
Keywords: 
kbbug kbfix KB304497
Retired KB ArticleRetired 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.
 

Article Translations