Per semplificare, questa è una situazione in cui un server NamedPipe sta aspettando un CLIENT NamedPipe per scrivere al tubo (utilizzando WriteFile())rottura ReadFile() blocco - denominato pipa (API Windows)
API Windows che sta bloccando è ReadFile()
il Server ha creato il tubo sincrona (non sovrapposto I/O) con il blocco abilitato
il client è connesso, e ora il server è in attesa di alcuni dati.
Nel normale flusso di cose, il client invia alcuni dati e il server lo elabora e quindi ritorna a ReadFile() per attendere il prossimo pezzo di dati.
Nel frattempo si verifica un evento (input utente per esempio) e NamedPipe SERVER deve ora eseguire un altro codice, che non può eseguire mentre il ReadFile() sta bloccando.
A questo punto devo dire che il Client NamedPipe non è la mia applicazione, quindi non ne ho il controllo. Non riesco a inviare alcuni byte per sbloccare il server. Sta semplicemente seduto lì e non invia dati. Dal momento che non ho il controllo dell'implementazione del Cliente, non posso cambiare nulla a tale scopo.
Una soluzione potrebbe essere quella di creare un thread separato in cui vengono eseguite tutte le operazioni di ReadFile(). In questo modo quando si verifica l'evento, posso solo elaborare il codice. Il problema è che l'evento richiede anche un thread separato, quindi ora ho due thread aggiuntivi per ogni istanza di questo server. Dal momento che questo deve essere scalabile, questo non è desiderabile.
da un altro thread ho provato a chiamare
DisconnectNamedPipe()
e
CloseHandle()
entrambi non tornerà (finché il client scrive al tubo.)
Non riesco a collegarmi alla stessa pipa e scrivere alcuni byte perché:
"Tutte le istanze di un nome pipe condivide lo stesso nome pipe, ma ogni istanza ha propri buffer e handle e fornisce un conduit separato per la comunicazione client/server ".
http://msdn.microsoft.com/en-us/library/aa365590.aspx
Ho bisogno di un modo per fingere fuori, così il $ 64k domanda di dollari è:
Come posso rompere il blocco di ReadFile()?
Quante di queste istanze "server" fanno hai? Stanno parlando di 10k ... So che l'overhead è basso, ma l'idea è di minimizzare questo. Sto solo facendo la domanda ... è possibile? –
Non penso che tu possa avere thread 10k :-) – alex2k8
Sì, sarebbe necessario un pool di thread, ma il punto è che c'è un sovraccarico di prestazioni associato all'avvio di un nuovo thread e ad ogni thread è allocata anche una certa memoria per il suo stack ecc. Questo si aggiunge ed è indesiderabile. –