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