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:
- Wątek inicjuje asynchroniczne żądanie odczytu, wywołując ReadFileEx z wskaźnikiem do funkcji wywołania zwrotnego.
- Wątek inicjuje żądanie asynchronicznego zapisu, wywołując WriteFileEx z wskaźnikiem do funkcji wywołania zwrotnego.
- 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:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
Po wprowadzeniu stanu alertu w wątku występują następujące zdarzenia:
- 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.
- Wątek wykonuje funkcję wywołania zwrotnego.
- Kroki 1 i 2 są powtarzane dla każdego wskaźnika pozostałego w kolejce.
- 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.
Tematy pokrewne