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 o fazem, 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 insere um estado alertável, ocorrem os seguintes eventos:
- O kernel verifica a fila do 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 estiver vazia, o thread retornará 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 WriteFileExe retornará da função que a colocou em um estado alertável.
Se um thread entrar em um estado alertável enquanto a fila do APC estiver vazia, a execução do thread será suspensa pelo kernel até que ocorra um destes 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 de E/S alertáveis com mais eficiência do que quando eles simplesmente esperam no sinalizador de evento no estrutura de OVERLAPPED a ser definida e o mecanismo de E/S alertável é menos complicado do que 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 apenas para o thread que a iniciou. As portas de conclusão de E/S não têm essa limitação.
Tópicos relacionados