Синхронный и асинхронный ioctl в рабочем потоке - PullRequest
2 голосов
/ 28 сентября 2011

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

Во второй попытке я использую перекрытие, и проблема исчезла. Но мне кажется, что эти два метода идентичны по поведению, так как я использую WaitForSingleObject, который ожидает срабатывания события (запрос завершен).

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

Синхронный:

WaitForIo {
    do {
        DeviceIoControl(hDevice,ioctl_code, ..., NULL);
        do something after io request completed
    } while(1);
    return;
}

Асинхронный:

WaitForIo {
    do {
        Overlapped ov;
        //CreateEvent
        DeviceIoControl(hDevice,ioctl_code, ..., &ov);
        WaitForSingleObject
        do something after io request completed
    } while(1);
}

почему два метода ведут себя по-разному? Что-то не так в моей логике?

1 Ответ

0 голосов
/ 28 сентября 2011

Если он блокирует поток, это означает, что вам нужно вернуть процессор, заставив его спать или что-то в этом роде. WaitForSingleObject делает именно это по умолчанию при вызове. Я не уверен в этом, но я думаю, что установка нулевого значения в функции DeviceIoControl заставила его подождать, сохраняя контроль над потоком - и таким образом блокирует поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...