Недавно я установил последнюю версию Visual Studio 2022 v17.10 для сборки своих программ, и поначалу все шло хорошо. Но после установки какой-то другой программы мои программы сразу же начали давать сбой при запуске, где вызывается первый std::mutex::lock()
, за исключением
0xC0000005: Местоположение чтения нарушения прав доступа 0x0000000000000000.
и трассировка стека:
msvcp140.dll!mtx_do_lock(_Mtx_internal_imp_t * mtx, const xtime * target) Line 100 C++
[Inline Frame] my.dll!std::_Mutex_base::lock()
[Inline Frame] my.dll!std::unique_lock<std::mutex>::{ctor}(std::mutex &)
Оказалось, что установленное приложение было создано в предыдущей версии Visual Studio 2022 и автоматически понижено C:\Windows\System32\msvcp140.dll
до версии 14.34.31931.0
, где происходит исключение.
Мне лично удалось восстановить нормальную работу моих программ, нажав Repair
в Microsoft Visual C++ 2015-2022 Redistributable (x64) - 14.40.33810
, что восстановило C:\Windows\System32\msvcp140.dll
до версии 14.40.33810.0
.
Но поскольку этот неожиданный сбой при запуске может легко случиться с пользователями моей программы, я хотел бы спросить, есть ли способ сделать программы, созданные в последней версии Visual Studio 2022, совместимыми со средами выполнения из предыдущих версий того же Visual Studio 2022. Студия 2022? Или, по крайней мере, как показать пользователям значимую ошибку, если по какой-то причине среда выполнения понижена, а не тихо завершено.
Короткий ответ: используйте макрос препроцессора _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR
.
Эта крупица информации из журнала изменений Microsoft/STL может помочь нам понять путаницу в Visual Studio, которая развернулась за последние пару дней.
Исправлен конструктор мьютекса — constexpr. #3824 #4000 #4339 Примечание: Программы, которые не соответствуют документированным ограничениям на двоичные файлы. совместимость может столкнуться с нулевым разыменованием в механизме мьютекса. Ты должен следовать следующему правилу: Когда вы смешиваете двоичные файлы, созданные разными поддерживаемые версии набора инструментов, распространяемая версия должна быть по крайней мере, такой же новый, как и последний набор инструментов, используемый любым компонентом приложения.
Вы можете определить _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR как escape. люк.
Я столкнулся с похожей проблемой в рабочем процессе GitHub Actions и пришел сюда из-за этих проблем, о которых независимо сообщалось в сообществе разработчиков Visual Studio:
Подробную разбивку можно найти - https://github.com/actions/runner-images/issues/10004#issuecomment-2156109231
Жаль, что я не нашел это, прежде чем потратить несколько часов на устранение этого сбоя. Но, по крайней мере, теперь я могу подтвердить, что это действительно правильный ответ.