Какова альтернатива 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
или короткие тайм-ауты неэффективны и являются признаком небрежного многопоточного программирования.
Но какова альтернатива в этом случае?