Udostępnij za pośrednictwem


We/Wy z możliwością zgłaszania alertów

We/Wy z możliwością alertu to metoda, za pomocą której wątki aplikacji przetwarzają asynchroniczne żądania we/wy tylko wtedy, gdy znajdują się w stanie alertów.

Aby zrozumieć, kiedy wątek jest w stanie umożliwiającym alert, rozważ następujący scenariusz:

  1. Wątek inicjuje asynchroniczne żądanie odczytu, wywołując ReadFileEx z wskaźnikiem do funkcji wywołania zwrotnego.
  2. Wątek inicjuje żądanie asynchronicznego zapisu, wywołując WriteFileEx z wskaźnikiem do funkcji wywołania zwrotnego.
  3. Wątek wywołuje funkcję, która pobiera wiersz danych z zdalnego serwera bazy danych.

W tym scenariuszu wywołania ReadFileEx i WriteFileEx najprawdopodobniej zostaną zwrócone przed wywołaniem funkcji w kroku 3. Gdy to zrobią, jądro umieszcza wskaźniki do funkcji wywołania zwrotnego w kolejce asynchronicznego wywołania procedury wątku (APC). Jądro utrzymuje tę kolejkę specjalnie do przechowywania zwróconych danych żądania we/wy do momentu przetworzenia go przez odpowiedni wątek.

Po zakończeniu pobierania wiersza i powrocie wątku z funkcji jej najwyższym priorytetem jest przetwarzanie zwracanych żądań we/wy w kolejce przez wywołanie funkcji wywołania zwrotnego. Aby to zrobić, musi wprowadzić stan alertu. Wątek może to zrobić tylko przez wywołanie jednej z następujących funkcji z odpowiednimi flagami:

Po wprowadzeniu stanu alertu w wątku występują następujące zdarzenia:

  1. Jądro sprawdza kolejkę APC wątku. Jeśli kolejka zawiera wskaźniki funkcji wywołania zwrotnego, jądro usuwa wskaźnik z kolejki i wysyła go do wątku.
  2. Wątek wykonuje funkcję wywołania zwrotnego.
  3. Kroki 1 i 2 są powtarzane dla każdego wskaźnika pozostałego w kolejce.
  4. Gdy kolejka jest pusta, wątek powraca z funkcji, która umieściła ją w stanie alertowalnym.

W tym scenariuszu, gdy wątek przejdzie w stan alertu, wywoła funkcje wywołania zwrotnego wysyłane do ReadFileEx i WriteFileEx, a następnie powrócić z funkcji, która umieściła ją w stanie alertable.

Jeśli wątek przejdzie w stan alertu, gdy kolejka APC jest pusta, wykonanie wątku zostanie zawieszone przez jądro do momentu wystąpienia jednego z następujących elementów:

  • Obiekt jądra, który jest czekany, staje się sygnalizowany.
  • Wskaźnik funkcji wywołania zwrotnego jest umieszczany w kolejce APC.

Wątek używający asynchronicznych żądań we/wy z możliwością alertów jest bardziej wydajny niż wtedy, gdy po prostu czekają na flagę zdarzenia w strukturze NAKŁADAJĄCE się, a mechanizm we/wy z możliwością alertu jest mniej skomplikowany niż portów uzupełniania we/wy do użycia. Jednak alertable We/Wy zwraca wynik żądania we/wy tylko do wątku, który go zainicjował. Porty ukończenia we/wy nie mają tego ograniczenia.

wywołania procedury asynchronicznej