отравляется ли C++ std::mutex, когда поток, удерживающий блокировку, внезапно завершается. Если да, то как мне восстановить этот мьютекс в другом потоке?
См. ответ в Что, если мьютекс, управляемый unique_lock, уничтожен?
Потоки не должны прерываться внезапно. Единственный способ сделать это — убить поток, чего никогда не следует делать по множеству причин. Другие способы внезапного завершения потоков обычно являются следствием какого-либо другого UB (нарушения доступа), и в этом случае ваша программа все равно уже сломана. Итак, каков ваш реальный (неправильный) вариант использования?
@PepijnKramer просто хотел узнать, существует ли подобная функциональность в C++, например Rust, которая обеспечивает механизм восстановления.
Первые два предложенных обмана связаны с уничтожением мьютекса, пока он занят (а не с завершением потока-владельца). Третий предложенный дубликат связан с завершением потоков, но не предлагает какого-либо общего ответа, основанного на стандарте C++, а дает конкретную информацию о поведении в системах POSIX и Windows. Поэтому считаю, что пост не стоит закрывать как дубликат.





Из документации std::mutex:
Поведение программы не определено, если мьютекс уничтожается во время выполнения программы. все еще принадлежит каким-либо потокам, или поток завершается, владея мьютекс.
(выделено мной)
Это означает, что вы находитесь в зоне UB (Неопределенное поведение) и не можете восстановиться.
Примечание:
Стоит отметить, что правильным решением будет не восстановление мьютекса, а скорее исправление ошибки, которая приводила к внезапному завершению потока. Эта ошибка, вероятно, вызвала и другие проблемы, помимо проблемы с мьютексом.
В любом случае, после возникновения UB, случиться может что угодно и рассуждать о поведении программы (не говоря уже о восстановлении после него) смысла нет.
В общем, используйте такие вещи, как std::lock_guard или std::unique_lock, чтобы блокировать мьютексы; если поток действительно завершается «внезапно», ваши мьютексы, как правило, не единственная проблема, с которой вы сталкиваетесь, и для всего, что более контролируемо, очистка будет автоматической.
Я подумывал предложить заменить ", и не может восстановиться". с помощью просто "." но решил, что на самом деле это полезная информация для тех, кто не знаком со всей концепцией UB. +1
Спасибо @TedLyngmo. Я добавил это еще и потому, что ОП специально спрашивал о восстановлении.
Что именно произошло, что вам нужно «восстановить этот мьютекс»? Может просто у вас какая-то ошибка в коде?