Немного предыстории, если вам интересно, иначе вы можете перейти прямо к вопросу внизу:
Я сталкиваюсь с проблемой, где у меня есть бесконечное 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.
Вы не можете выполнить код вне Тема! Есть основная тема, которая начинается с main
но это тоже нить, как и любой другой.
Тем не менее, тупик требует 2 потока и 2 точки синхронизации. Один поток блокирует A, другой поток блокирует B, и затем оба потока блокируются, когда они пытаются получить другую блокировку.
Это может быть решено абсолютно при наличии порядка блокировки. Если замок А всегда заблокирован до B, то не может возникнуть тупик между потоками, которые имеют A и другие потоки, которые имеют блокировку B.
Более теоретический подход доказывает, что проблема представляет собой цикл в графе блокировок. Цикл А<=> B — простейший цикл длины 2. A-> B-> C-> A также может зайти в тупик. Направленный ациклический график порядка блокировок соответствует программе без тупиков.
Других решений пока нет …