Функция 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, который использует перекрывающийся ввод / вывод, например, для этого.Например, для pipe server функция 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
или короткие тайм-ауты, неработать хорошо и является признаком небрежного многопоточного программирования.
Но какова альтернатива в этом случае?