Opened 8 years ago

Last modified 6 years ago

#10715 new Bugs

Race condition in codecvt() persists in VC++

Reported by: willw@… Owned by: Beman Dawes
Milestone: To Be Determined Component: filesystem
Version: Boost 1.54.0 Severity: Problem
Keywords: codecvt race Cc: raad@…

Description

This is a restatement of Ticket #6320, which is still causing me problems; specifically when path objects are used in a DLL with multithreading. Environment is VC++11, although I believe it is also applicable to VC++12. Both versions have documentation warnings against using static local variables in a multithreaded application.

Demo code: A DLL containing the simple function:

//  exported function.
extern "C" DLL_API void fnDll( void )
{
	boost::filesystem::path p("test_path");
	return;
}

The main program creates threads to load the DLL and call this function:

void thread_func() 
{
	boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	HINSTANCE hLib = LoadLibraryA("Dll.dll"); 
	if (hLib != NULL) { // Resolve test function in DLL
		FARPROC f = GetProcAddress(hLib,"fnDll");
		if (f)	f(); // call it
	}
}

int main(int argc, _TCHAR* argv[])
{
	boost::thread_group tg;
	for(int i = 0; i < 2; i++)
		tg.create_thread(thread_func);
	tg.join_all();
	return 0;
}

Built and run for debug, this code fails when the BOOST_ASSERT:

"codecvt_facet_ptr() facet hasn't been properly initialized"

fires on line 888, in const path::codecvt_type& path::codecvt()

The user workaround is to put code in DllMain's DLL_PROCESS_ATTACH, as described in the earlier ticket, to force initialisation before multiple threads share the DLL.

I attach the Visual Studio project used to test this. This DLL scenario is a simplification of a genuine situation: I found it when an Apache add-on started crashing its host.

Attachments (1)

Boost FileSystem Test.zip (16.1 KB ) - added by willw@… 8 years ago.
Visual Studio 2012 project demo's multi-threaded ASSERT

Download all attachments as: .zip

Change History (2)

by willw@…, 8 years ago

Attachment: Boost FileSystem Test.zip added

Visual Studio 2012 project demo's multi-threaded ASSERT

comment:1 by raad@…, 6 years ago

Cc: raad@… added
Note: See TracTickets for help on using tickets.