E/S alertável
E/S alertável é o método pelo qual os threads de aplicativo processam solicitações de E/S assíncronas somente quando estão em um estado alertável.
Para entender quando um thread está em um estado alertável, considere o seguinte cenário:
- Um thread inicia uma solicitação de leitura assíncrona chamando ReadFileEx com um ponteiro para uma função de retorno de chamada.
- O thread inicia uma solicitação de gravação assíncrona chamando WriteFileEx com um ponteiro para uma função de retorno de chamada.
- O thread chama uma função que busca uma linha de dados de um servidor de banco de dados remoto.
Nesse cenário, as chamadas para ReadFileEx e WriteFileEx provavelmente retornarão antes da chamada de função na etapa 3. Quando isso acontece, o kernel coloca os ponteiros para as funções de retorno de chamada na fila APC (Chamada de Procedimento Assíncrono) do thread. O kernel mantém essa fila especificamente para manter os dados de solicitação de E/S retornados até que possam ser processados pelo thread correspondente.
Quando a busca de linha é concluída e o thread retorna da função, sua prioridade mais alta é processar as solicitações de E/S retornadas na fila chamando as funções de retorno de chamada. Para fazer isso, ele deve inserir um estado alertável. Um thread só pode fazer isso chamando uma das seguintes funções com os sinalizadores apropriados:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- Msgwaitformultipleobjectsex
Quando o thread entra em um estado alertável, os seguintes eventos ocorrem:
- O kernel verifica a fila de APC do thread. Se a fila contiver ponteiros de função de retorno de chamada, o kernel removerá o ponteiro da fila e o enviará para o thread.
- O thread executa a função de retorno de chamada.
- As etapas 1 e 2 são repetidas para cada ponteiro restante na fila.
- Quando a fila está vazia, o thread retorna da função que a colocou em um estado alertável.
Nesse cenário, depois que o thread entrar em um estado alertável, ele chamará as funções de retorno de chamada enviadas para ReadFileEx e WriteFileEx e retornará da função que a colocou em um estado alertável.
Se um thread entrar em um estado alertável enquanto sua fila de APC estiver vazia, a execução do thread será suspensa pelo kernel até que ocorra um dos seguintes procedimentos:
- O objeto kernel que está sendo aguardado fica sinalizado.
- Um ponteiro de função de retorno de chamada é colocado na fila do APC.
Um thread que usa solicitações de E/S assíncronas de processos de E/S alertáveis com mais eficiência do que quando simplesmente aguarda o sinalizador de evento na estrutura OVERLAPPED a ser definido e o mecanismo de E/S alertável é menos complicado do que as portas de conclusão de E/S a serem usadas . No entanto, a E/S alertável retorna o resultado da solicitação de E/S somente para o thread que a iniciou. As portas de conclusão de E/S não têm essa limitação.
Tópicos relacionados