std :: locale/std :: facet Критический раздел

Из любопытства. Раньше я видел ухудшение производительности в функции, например boost::to_lower из-за CriticalSection используемого в std::use_facet когда выделен ленивый грань. Насколько я помню, была ошибка с глобальной блокировкой по языку, но, по словам Стефана Лавави, она была исправлена в VS2013. И вуаля, я видел эту блокировку на сервере, убивающем сервер, вчера, поэтому, я думаю, я путаю два разных вопроса.
Но, во-первых, почему существует CriticalSection вокруг ленивой грани? Очевидно, это испортит спектакль. Почему они не разрешили какие-либо модернизируемые блокировки или атомные операции над указателями?

Ответы

Ответ 1

MSVC++ std::locale реализуется в терминах базовой функции C setlocale. Это касается глобального состояния и поэтому должно быть защищено блокировкой.

Изменение семантики блокировки структуры данных, к сожалению, является нарушением ABI, поэтому мы не сможем немного с этим поработать.