Condividi tramite


I/O avvisabile

L'I/O avvisabile è 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, prendere in considerazione lo scenario seguente:

  1. Un thread avvia una richiesta di lettura asincrona chiamando ReadFileEx con un puntatore a una funzione di callback.
  2. Il thread avvia una richiesta di scrittura asincrona chiamando WriteFileEx con un puntatore a una funzione di callback.
  3. 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 probabilmente prima della chiamata di funzione nel passaggio 3. Quando lo fanno, il kernel inserisce i puntatori alle funzioni di callback nella coda APC (Asynchronous Procedure Call) del thread. Il kernel gestisce questa coda specificamente per contenere i dati delle richieste di I/O restituiti fino a quando non possono essere elaborati 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 entrare in uno stato di avviso. Un thread può eseguire questa operazione solo chiamando una delle funzioni seguenti con i flag appropriati:

Quando il thread entra in uno stato di avviso, si verificano gli eventi seguenti:

  1. 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.
  2. Il thread esegue la funzione di callback.
  3. I passaggi 1 e 2 vengono ripetuti per ogni puntatore rimanente nella coda.
  4. Quando la coda è vuota, il thread restituisce dalla funzione che lo ha inserito 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 restituirà 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 alla funzione di callback viene inserito nella coda APC.

Un thread che usa richieste di I/O asincrone di I/O avvisabili in modo più efficiente rispetto a quando attende semplicemente il flag di evento nella struttura diOVERLAPPEDda impostare e il meccanismo di I/O avvisabile è meno complicato di porte di completamento I/O da usare. Tuttavia, l'I/O avvisabile restituisce il risultato della richiesta di I/O solo al thread che l'ha avviata. Le porte di completamento di I/O non hanno questa limitazione.

chiamate di procedure asincrone