I/O di avviso
L'I/O di avviso è il metodo con cui i thread dell'applicazione elaborano le richieste di I/O asincrone solo quando si trovano in uno stato di avviso.
Per comprendere quando un thread si trova in uno stato di avviso, considerare lo scenario seguente:
- Un thread avvia una richiesta di lettura asincrona chiamando ReadFileEx con un puntatore a una funzione di callback.
- Il thread avvia una richiesta di scrittura asincrona chiamando WriteFileEx con un puntatore a una funzione di callback.
- Il thread chiama una funzione che recupera una riga di dati da un server di database remoto.
In questo scenario, le chiamate a ReadFileEx e WriteFileEx restituiranno molto probabilmente prima della chiamata di funzione nel passaggio 3. In questo caso, il kernel inserisce i puntatori alle funzioni di callback nella coda APC (Asynchronous Procedure Call) del thread. Il kernel gestisce questa coda in modo specifico per contenere i dati delle richieste di I/O restituiti fino a quando non può essere elaborato dal thread corrispondente.
Quando il recupero delle righe è completo e il thread restituisce dalla funzione, la priorità più alta consiste nell'elaborare le richieste di I/O restituite nella coda chiamando le funzioni di callback. A tale scopo, deve immettere uno stato di avviso. Un thread può eseguire questa operazione solo chiamando una delle funzioni seguenti con i flag appropriati:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
Quando il thread entra in uno stato di avviso, si verificano gli eventi seguenti:
- Il kernel controlla la coda APC del thread. Se la coda contiene puntatori a funzione di callback, il kernel rimuove il puntatore dalla coda e lo invia al thread.
- Il thread esegue la funzione di callback.
- I passaggi 1 e 2 vengono ripetuti per ogni puntatore rimanente nella coda.
- Quando la coda è vuota, il thread restituisce dalla funzione che l'ha inserita in uno stato di avviso.
In questo scenario, dopo che il thread entra in uno stato di avviso, chiamerà le funzioni di callback inviate a ReadFileEx e WriteFileEx, quindi restituisce dalla funzione che lo ha inserito in uno stato di avviso.
Se un thread entra in uno stato di avviso mentre la coda APC è vuota, l'esecuzione del thread verrà sospesa dal kernel fino a quando non si verifica una delle operazioni seguenti:
- L'oggetto kernel in attesa viene segnalato.
- Un puntatore a funzione di callback viene inserito nella coda APC.
Un thread che usa richieste di I/O di I/O avvisi in modo più efficiente rispetto a quando attende semplicemente il flag di evento nella struttura OVERLAPPED da impostare e il meccanismo di I/O di avviso è meno complicato rispetto alle porte di completamento I/O di I/O da usare. Tuttavia, l'I/O avvisabile restituisce il risultato della richiesta di I/O solo al thread che lo ha avviato. Le porte di completamento di I/O non presentano questa limitazione.
Argomenti correlati