Para simplificar, se trata de una situación en la que un servidor NamedPipe se espera el cliente NamedPipe a escribir a la tubería (usando WriteFile())Breaking ReadFile() bloqueo - canalización con nombre (API de Windows)
La API de Windows que se bloquea es ReadFile()
el servidor ha creado la tubería síncrona (sin superpuesto e/S) con el bloqueo activado
el cliente se ha conectado, y ahora el servidor está a la espera de algunos datos.
En el flujo normal de cosas, el cliente envía algunos datos y el servidor los procesa y luego regresa a ReadFile() para esperar el siguiente fragmento de datos.
Mientras tanto ocurre un evento (por ejemplo, la entrada del usuario) y el SERVIDOR NamedPipe ahora debe ejecutar algún otro código, lo que no puede hacer mientras ReadFile() está bloqueando.
En este punto debo mencionar que el cliente de NamedPipe no es mi aplicación, por lo que no tengo control sobre ella. No puedo enviar unos bytes para desbloquear el servidor. Simplemente se sentará allí y no enviará datos. Como no tengo control de la implementación del Cliente, no puedo cambiar nada en ese extremo.
Una solución sería crear un hilo separado en el que se realicen todas las operaciones de ReadFile(). De esa forma, cuando ocurre el evento, puedo procesar el código. El problema con eso, es que el evento también requiere un hilo separado, por lo que ahora tengo dos hilos adicionales para cada instancia de este servidor. Como esto necesita ser escalable, esto no es deseable.
De otro hilo que he intentado llamar
DisconnectNamedPipe()
y
CloseHandle()
que ambos no volverán (hasta que el cliente escribe a la tubería.)
No me puedo conectar a la misma tubería y escriba algunos bytes porque:
"Todas las instancias de un nombre pipe comparte el mismo nombre de pipe, pero cada instancia tiene sus propios búferes y manejadores, y proporciona un conducto separado para la comunicación cliente/servidor ".
http://msdn.microsoft.com/en-us/library/aa365590.aspx
Necesito una manera de fingir a cabo, lo que la pregunta dólar $ 64k es:
¿Cómo puedo romper el bloqueo de ReadFile()?
¿Cuántas de estas instancias de "servidor" ¿tienes? Están hablando de hasta 10k ... Sé que la sobrecarga es baja, pero la idea es minimizar esto. Solo estoy haciendo la pregunta ... ¿es posible? –
No creo que pueda tener hilos de 10k :-) – alex2k8
Sí, eso requeriría un grupo de subprocesos, pero el punto es que hay una sobrecarga de rendimiento asociada al inicio de un nuevo subproceso, y cada subproceso también tiene asignada memoria para su pila etc. Esto se suma y es indeseable. –