WaitForSingleObject Deadlock

Немного предыстории, если вам интересно, иначе вы можете перейти прямо к вопросу внизу:

Я сталкиваюсь с проблемой, где у меня есть бесконечное while петля с двумя if проверка условий для двух состояний объекта события, чтобы стать сигнальными.

while(1)
{
if(DAQ_Comm_Server::usb_detect_flag == false)
{
if(WaitForSingleObject(USB_PHY_CONN,INFINITE) == WAIT_OBJECT_0)
{
DAQ_Comm_Server::usb_detect_flag = true;
}
}

if(DAQ_Comm_Server::usb_detect_flag == true)
{
if(WaitForSingleObject(USB_PHY_DISCONN, INFINITE) == NULL)
{
DAQ_Comm_Server::usb_detect_flag = false;
}
}
}

Объекты события USB_PHY_CONN а также USB_PHY_DISCONN устанавливаются в моем коде драйвера ОС / BSP USB, где он обнаружит аппаратное USB-соединение и перейдет к использованию SetEvent() установить соответствующий объект события.

Чтение документации для WaitForSingleObject(), он явно не утверждает, что он должен использоваться внутри потока, хотя после прочтения его несколько раз я чувствую, что это подразумевается, но я не уверен на 100%.

Проблема, с которой я сталкиваюсь, это первый раз, когда код проходит через цикл while (т. Е. Usb изначально отключен, затем подключен и отключен), моя система работает нормально и не зависает. Однако при повторном подключении USB моя система зависает. Мое устройство перестает отвечать на запросы / пользовательский интерфейс зависает и код теряется.

Теперь, в момент, когда я завершаю процесс, в котором у меня есть вышеуказанный код, все запускается обратно и продолжает работать нормально. Я немного почитал, и кажется, что WaitForSingleObject() Существует риск возможной тупиковой ситуации, но я также заметил, что это всегда с точки зрения потоков.

Мой вопрос, делает WaitForSingleObject() Должны быть использованы в потоке? Если я использую его в бесконечном цикле в главном, рискует ли это тупик / зависание системы?

Примечание. Это проект Windows 7, встроенный в конструктор платформ Windows 7 VS2008.

0

Решение

Вы не можете выполнить код вне Тема! Есть основная тема, которая начинается с main но это тоже нить, как и любой другой.

Тем не менее, тупик требует 2 потока и 2 точки синхронизации. Один поток блокирует A, другой поток блокирует B, и затем оба потока блокируются, когда они пытаются получить другую блокировку.

Это может быть решено абсолютно при наличии порядка блокировки. Если замок А всегда заблокирован до B, то не может возникнуть тупик между потоками, которые имеют A и другие потоки, которые имеют блокировку B.

Более теоретический подход доказывает, что проблема представляет собой цикл в графе блокировок. Цикл А<=> B — простейший цикл длины 2. A-> B-> C-> A также может зайти в тупик. Направленный ациклический график порядка блокировок соответствует программе без тупиков.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]