Какова альтернатива WaitNamedPipe для ввода-вывода?

WaitNamedPipe Функция позволяет клиентскому приложению канала синхронно ожидать доступное соединение на именованном канальном сервере. Вы тогда звонитеCreateFile открыть трубу как клиент. псевдокод:

// loop works around race condition with WaitNamedPipe and CreateFile
HANDLE hPipe;
while (true) {
    if (WaitNamedPipe says connection is ready) {
        hPipe = CreateFile(...);
        if (hPipe ok or last error is NOT pipe busy) {
            break; // hPipe is valid or last error is set
        }
    } else {
        break; // WaitNamedPipe failed
    }
}

Проблема в том, что это все синхронные звонки. Какой хороший способ сделать это асинхронно? Я не могу найти API, который использует перекрывающийся ввод / вывод, например, для этого. Например, для трубысерверы ConnectNamedPipe функция обеспечиваетlpOverlapped параметры, позволяющие серверу асинхронно ожидать клиента. Труба сервер может затем вызватьWaitForMultipleObjects и дождаться завершения операции ввода-вывода или любого другого события, о котором будет сообщено (например, событие, сигнализирующее потоку об отмене ожидающего ввода-вывода и завершении).

Единственный способ, которым я могу думать, это позвонитьWaitNamedPipe в цикле с коротким, конечным таймаутом и проверьте другие сигналы, если он истекает. В качестве альтернативы, в вызове циклаCreateFile, проверьте другие сигналы, а затем позвонитеSleep с небольшой задержкой (илиWaitNamedPipe). Например:

HANDLE hPipe;
while (true) {
    hPipe = CreateFile(...);
    if (hPipe not valid and pipe is busy) {
        // sleep 100 milliseconds; alternatively, call WaitNamedPipe with timeout
        Sleep(100);
        // TODO: check other signals here to see if we should abort I/O
    } else
        break;
}

Но этот метод воняет на небеса по моему мнению. Если канал некоторое время недоступен, поток продолжает работать - он загружает процессор, использует энергию, требует, чтобы страницы памяти оставались в оперативной памяти, и т. Д. На мой взгляд, поток, который полагается наSleep или короткие тайм-ауты неэффективны и являются признаком небрежного многопоточного программирования.

Но какова альтернатива в этом случае?

Ответы на вопрос(2)

Ваш ответ на вопрос