これまでの経緯

これまでの調査で、落ちる箇所が数パターンに絞れることがわかってきました。コールスタックによると locale オブジェクトの解放時の落ちるケースが多いようです。locale ヘッダ内の該当箇所を見てみると、

	~locale() _THROW0()
		{	// destroy the object
		if (_Ptr != 0)
			_DELETE_CRT(_Ptr->_Decref());
		}

Decref() という名前から、どうやら locale オブジェクトには別の実体があり、リファレンスカウンタで管理しているようですね。複数のスレッドからカウンタの上げ下げをする場合は、ちゃんとロックをかけておかないと数が狂ってしまうので、二重の開放とかが起きてマズそうですね。いかにも今回の問題と(現象的には)似ています。

そこで Dinkumware のロック機構を追いかけてみると、yyval.h にありました。
そこにはロックや排他制御回りのクラスがあり、ある define の設定によって有効/無効を切り替えられるようになっていました。その define 名とは、

#define _IOSTREAM_OP_LOCKS	0	/* 0 for no iostream locks, 1 for atomic */

…なんか、いかにもな名前ですね…。そして現状では無効になっていると。orz
それじゃこれを 1 にすれば万事解決? と思ってビルドしてみると、

[リンカ エラー] Error: 未解決の外部参照 'std::_Mutex::_Lock()' が C:\USERS\...\\MAIN-BEGINTHREADEX.OBJ から参照されました
[リンカ エラー] Error: 未解決の外部参照 'std::_Mutex::_Unlock()' が C:\USERS\...\\MAIN-BEGINTHREADEX.OBJ から参照されました
[リンカ エラー] Error: 未解決の外部参照 'std::_Mutex::~_Mutex()' が C:\USERS\...\\MAIN-BEGINTHREADEX.OBJ から参照されました
[リンカ エラー] Error: 未解決の外部参照 'std::_Mutex::_Mutex()' が C:\USERS\...\\MAIN-BEGINTHREADEX.OBJ から参照されました

なんかリンカエラーになってしまいました。実装された部分は外部のライブラリに存在するようです。当然ながらライブラリで提供されている所については、ソースは存在しないことになります。STL はヘッダだけの存在…と思っていた身にはちょっとしたショックでした。
そして、この後に及んでどうしようもない状況となってしまったため、この件はいったんお蔵入りにするしかありませんでした。