Первый сбой std::mutex::lock() в приложении, созданном с помощью последней версии Visual Studio 2022

Недавно я установил последнюю версию 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? Или, по крайней мере, как показать пользователям значимую ошибку, если по какой-то причине среда выполнения понижена, а не тихо завершено.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
1 700
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Короткий ответ: используйте макрос препроцессора _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR.

Эта крупица информации из журнала изменений Microsoft/STL может помочь нам понять путаницу в Visual Studio, которая развернулась за последние пару дней.

Исправлен конструктор мьютекса — constexpr. #3824 #4000 #4339 Примечание: Программы, которые не соответствуют документированным ограничениям на двоичные файлы. совместимость может столкнуться с нулевым разыменованием в механизме мьютекса. Ты должен следовать следующему правилу: Когда вы смешиваете двоичные файлы, созданные разными поддерживаемые версии набора инструментов, распространяемая версия должна быть по крайней мере, такой же новый, как и последний набор инструментов, используемый любым компонентом приложения.

Вы можете определить _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR как escape. люк.

--- Журнал изменений microsoft/STL

Я столкнулся с похожей проблемой в рабочем процессе GitHub Actions и пришел сюда из-за этих проблем, о которых независимо сообщалось в сообществе разработчиков Visual Studio:

  1. https://developercommunity.visualstudio.com/t/All-my-std::unique_lock-crashed-after-th/10665376?space=41&sort=newest&viewtype=all
  2. https://developercommunity.visualstudio.com/t/Access-violation-in-_Thrd_yield-after-up/10664660
  3. https://github.com/actions/runner-images/issues/10004

Подробную разбивку можно найти - https://github.com/actions/runner-images/issues/10004#issuecomment-2156109231

Жаль, что я не нашел это, прежде чем потратить несколько часов на устранение этого сбоя. Но, по крайней мере, теперь я могу подтвердить, что это действительно правильный ответ.

VZ. 24.07.2024 18:17

Другие вопросы по теме