[VS2015] Проблемы с std::locale/setlocale
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 11.10.17 12:44
Оценка:
Привет всем.

Мне тут пользователь заслал дамп с падением его программы из-за моего модуля.

  Стек падения
ucrtbase.dll!__acrt_release_locale_ref()    Unknown    Non-user code. Symbols loaded.
ucrtbase.dll!_updatetlocinfoEx_nolock()    Unknown    Non-user code. Symbols loaded.
ucrtbase.dll!__acrt_update_thread_locale_data()    Unknown    Non-user code. Symbols loaded.
ucrtbase.dll!_wsetlocale()    Unknown    Non-user code. Symbols loaded.
ucrtbase.dll!call_wsetlocale()    Unknown    Non-user code. Symbols loaded.
ucrtbase.dll!setlocale()    Unknown    Non-user code. Symbols loaded.
msvcp140.dll!std::_Locinfo::_Locinfo_ctor(std::_Locinfo * pLocinfo, int cat, const char * locname) Line 149    C++    Non-user code. Symbols loaded.
msvcp140.dll!std::_Locinfo::_Locinfo(int _Cat, const char * _Pch) Line 90    C++    Non-user code. Symbols loaded.
MyModule.dll!std::locale::_Construct(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str, int) Line 368    C++    Non-user code. Symbols loaded.
MyModule.dll!std::locale::locale(const char *) Line 400    C++    Non-user code. Symbols loaded.
>[Inline Frame] MyModule.dll!structure::t_char_lower<wchar_t>::{ctor}(const char * const) Line 270    C++    Symbols loaded.

Говорит, исходя из опыта, проблема в многопоточном вызове ucrtbase.dll!setlocale(). И приводит пару ссылок с подобными проблемами:

https://connect.microsoft.com/VisualStudio/feedback/details/790530/crt-function-setlocale-imp-setlocale-crashes-with-multithreaded-applications
https://connect.microsoft.com/VisualStudio/feedback/details/794122

У меня этот setlocale не вызывается. Я юзаю std::locale("C").

Я уже огребал проблемы с этим std::locale в многопоточном коде (VS2005-VS2010) — он там внутри юзал MT-блокировку, которая многопоточный код ставит раком делает однопоточным.

В критических местах я эту проблему решил (задействую глобальные объекты этого класса, которые создаются при инициализации модуля).

А в других местах оставил как есть (создаю локальный объект std::locale и юзаю его). Как раз в таком месте оно и упало.

---
Интересно, они в VS2015-ой что, ту MT-блокировку изничтожили, из-за которой у меня раньше все тупило? Или оно не падало потому что везло?

С другой стороны пока глобальные объекты не были задействован, почему оно не падало?

---
Есть конечно вариант, что кто-то нагадил в память.

Но больше склоняюсь к тому, что трабла именно с std::locale.

Сам я решил изничтожить использование std::locale в своем коде.

Но интересно узнать мнение других.

---
Спасибо, что дочитали этот поток сознания до конца.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 11.10.2017 12:45 DDDX . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.