#c #multithreading #deadlock #freeze
#c #многопоточность #взаимоблокировка #замораживание
Вопрос:
Я отлаживаю свое приложение, но какой-то модуль (возможно, пользовательский) вызывает взаимоблокировку. Основной поток просто зависает с некоторым EIP, и процесс зависает, информация о потоке ниже списка потоков
Как я могу узнать, что вызывает эту проблему? Кроме того, я попытался создать файл дампа и проанализировать его с помощью windbg, и я получил этот стек:
0077d8ac 7693c9b8 ntdll!NtWaitForMultipleObjects 0xc
0077d8c8 571a2ffd KERNELBASE!WaitForMultipleObjects 0x18
Ценю любую помощь!
Ответ №1:
Сначала необходимо выяснить, есть ли у вас какие-либо статические переменные. Если да, то вам нужно сделать его потокобезопасным.
Кроме того, если ваш код является инициатором нескольких потоков, проверьте, не используется ли какая-либо структура данных совместно с новым потоком каким-либо образом. Тогда они также должны быть потокобезопасными.
Также могут быть некоторые общие неявные структуры данных … возможно, какой-то сеанс… доступ к этим структурам должен быть упрощен путем обертывания этих структур в классе и обеспечения его потокобезопасности — и обязательного использования нового класса непосредственно над структурой данных.
Ответ №2:
Я бы попытался найти комбинацию этих пользовательских модулей, которые вызывают взаимоблокировку. Скажем, если у вас есть модуль A, B, C, D и вы включаете только модуль A, D и получаете взаимоблокировку, тогда вам следует подробнее изучить модули.
Также добавьте debug / log в свой пользовательский модуль в возможные функции, требующие много времени / бесконечного цикла.