Cuál es una alternativa de E / S superpuesta a WaitNamedPipe?
LosWaitNamedPipe
a función @ permite que una aplicación de cliente de tubería espere sincrónicamente una conexión disponible en un servidor de tubería con nombre. Entonces llamas aCreateFile
para abrir la tubería como cliente. Pseudocódigo:
// 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
}
}
El problema es que todas estas son llamadas bloqueadas y sincrónicas. ¿Cuál es una buena manera de hacer esto de forma asincrónica? Parece que no puedo encontrar una API que use E / S superpuestas para hacer esto, por ejemplo. Por ejemplo, para tubería servidores elConnectNamedPipe
a función @ proporciona unalpOverlapped
parámetros que permiten que un servidor espere asincrónicamente a un cliente. El servidor de tuberías puede llamar a WaitForMultipleObjects y espere a que se complete la operación de E / S o que se señale cualquier otro evento (por ejemplo, un evento que indique al hilo que cancele la E / S pendiente y finalice).
La única forma en que se me ocurre es llamar aWaitNamedPipe
en un bucle con un tiempo de espera corto y finito y verifique otras señales si se agota el tiempo. Alternativamente, en una llamada en bucleCreateFile
, verifique otras señales y luego llame aSleep
con un breve retraso (oWaitNamedPipe
). Por ejemplo
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;
}
Pero este método apesta al cielo alto en mi opinión. Si una tubería no está disponible por un tiempo, el subproceso continúa ejecutándose, absorbiendo la CPU, usando energía, requiriendo que las páginas de memoria permanezcan en la RAM, etc. En mi opinión, un subproceso que se basa enSleep
o los tiempos de espera cortos no funcionan bien y es una señal de una programación desproporcionada de subprocesos múltiples.
¿Pero cuál es la alternativa en este caso?