взаимоблокировка основного потока C

#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 в свой пользовательский модуль в возможные функции, требующие много времени / бесконечного цикла.