Konteksty
W tym dokumencie opisano rolę kontekstów w środowisku uruchomieniowym współbieżności. Wątek dołączony do harmonogramu jest nazywany kontekstem wykonywania lub tylko kontekstem. Funkcja concurrency::wait i klasa concurrency::Context umożliwiają kontrolowanie zachowania kontekstów. wait
Użyj funkcji , aby zawiesić bieżący kontekst przez określony czas. Użyj klasy, gdy potrzebujesz większej Context
kontroli nad tym, kiedy konteksty blokują, odblokuj i dają lub gdy chcesz zastąpić bieżący kontekst.
Napiwek
Środowisko uruchomieniowe współbieżności udostępnia domyślny harmonogram, dlatego nie jest wymagane utworzenie go w aplikacji. Ponieważ harmonogram zadań ułatwia dostosowanie wydajności aplikacji, zalecamy rozpoczęcie od biblioteki równoległych wzorców (PPL) lub biblioteki agentów asynchronicznych, jeśli dopiero zaczynasz pracę ze środowiskiem uruchomieniowym współbieżności.
Funkcja wait
Funkcja concurrency::wait współdziała z wykonaniem bieżącego kontekstu dla określonej liczby milisekund. Środowisko uruchomieniowe używa czasu wydajności do wykonywania innych zadań. Po upływie określonego czasu środowisko uruchomieniowe ponownie określa kontekst wykonywania. wait
W związku z tym funkcja może zawiesić bieżący kontekst dłużej niż wartość podana dla parametrumilliseconds
.
Przekazanie wartości 0 (zero) dla parametru milliseconds
powoduje, że środowisko uruchomieniowe zawiesi bieżącego kontekstu do momentu, gdy wszystkie inne aktywne konteksty będą mieć możliwość wykonania pracy. Dzięki temu można uzyskać zadanie do wszystkich innych aktywnych zadań.
Przykład
Aby zapoznać się z przykładem, który używa wait
funkcji do zwracania bieżącego kontekstu, a tym samym zezwalania na uruchamianie innych kontekstów, zobacz Instrukcje: używanie grup harmonogramu do wywierania wpływu na kolejność wykonywania.
Klasa kontekstu
Klasa concurrency::Context zapewnia abstrakcję programowania dla kontekstu wykonywania i oferuje dwie ważne funkcje: możliwość współpracy blokowania, odblokowywania i zwracania bieżącego kontekstu oraz możliwości zastępowania bieżącego kontekstu.
Blokowanie współpracy
Klasa Context
umożliwia blokowanie lub zwracanie bieżącego kontekstu wykonywania. Blokowanie lub zwracanie jest przydatne, gdy bieżący kontekst nie może kontynuować, ponieważ zasób jest niedostępny.
Współbieżność ::Context::Block , metoda blokuje bieżący kontekst. Zablokowany kontekst daje zasoby przetwarzania, dzięki czemu środowisko uruchomieniowe może wykonywać inne zadania. Metoda concurrency::Context::Unblock odblokuje zablokowany kontekst. Metoda musi być wywoływana Context::Unblock
z innego kontekstu niż metoda o nazwie Context::Block
. Środowisko uruchomieniowe zgłasza współbieżność::context_self_unblock , jeśli kontekst próbuje odblokować się.
Aby wspólnie zablokować i odblokować kontekst, zazwyczaj wywołujesz współbieżność::Context::CurrentContext , aby pobrać wskaźnik do Context
obiektu skojarzonego z bieżącym wątkiem i zapisać wynik. Następnie wywołasz metodę , Context::Block
aby zablokować bieżący kontekst. Później wywołaj Context::Unblock
połączenie z oddzielnego kontekstu, aby odblokować zablokowany kontekst.
Należy dopasować każdą parę wywołań do Context::Block
i Context::Unblock
. Środowisko uruchomieniowe zgłasza współbieżność::context_unblock_unbalanced , gdy Context::Block
metoda or Context::Unblock
jest wywoływana kolejno bez zgodnego wywołania do innej metody. Jednak nie musisz dzwonić przed wywołaniem Context::Block
.Context::Unblock
Jeśli na przykład jeden kontekst wywołuje Context::Unblock
przed innym kontekstem wywołanie Context::Block
tego samego kontekstu, kontekst ten pozostaje odblokowany.
Współbieżność ::Context::Yield metoda daje wykonanie, dzięki czemu środowisko uruchomieniowe może wykonywać inne zadania, a następnie zmieniać harmonogram kontekstu na potrzeby wykonywania. Podczas wywoływania Context::Block
metody środowisko uruchomieniowe nie zmienia harmonogramów kontekstu.
Przykład
Aby zapoznać się z przykładem, który używa metod , Context::Unblock
i do implementowania klasy semafora kooperatywnego, zobacz How to: Use the Context::Block
Context Class to Implement a Cooperative Semaphore (Instrukcje: używanie klasy kontekstu do implementowania semafora kooperatywnegoContext::Yield
).
Nadsubskrypcji
Domyślny harmonogram tworzy taką samą liczbę wątków, jak dostępne wątki sprzętowe. Aby utworzyć dodatkowe wątki dla danego wątku sprzętowego, można użyć podsubskrypcji .
W przypadku operacji intensywnie korzystających z obliczeń zasubskrypcja zwykle nie jest skalowana, ponieważ wprowadza dodatkowe obciążenie. Jednak w przypadku zadań, które mają duże opóźnienie, na przykład odczytywanie danych z dysku lub z połączenia sieciowego, zasubskrypcja może poprawić ogólną wydajność niektórych aplikacji.
Uwaga
Włącz zasubskrypcję tylko z wątku utworzonego przez środowisko uruchomieniowe współbieżności. Zasubskrypcja nie ma wpływu, gdy jest wywoływana z wątku, który nie został utworzony przez środowisko uruchomieniowe (w tym główny wątek).
Aby włączyć nadsubskrypcję w bieżącym kontekście, wywołaj metodę concurrency::Context::Oversubscribe z parametrem ustawionym _BeginOversubscription
na true
. Po włączeniu nadsubskrypcji w wątku utworzonym przez środowisko uruchomieniowe współbieżności powoduje utworzenie przez środowisko uruchomieniowe jednego dodatkowego wątku. Po zakończeniu wszystkich zadań wymagających zakończenia zasubskrypcji wywołaj Context::Oversubscribe
parametr z parametrem ustawionym _BeginOversubscription
na false
.
Możesz włączyć wielokrotne zastępowanie z bieżącego kontekstu, ale należy wyłączyć tę samą liczbę razy, ile razy ją włączysz. Zagnieżdżenia można również zagnieżdżać; oznacza to, że zadanie tworzone przez inne zadanie korzystające z nadsubskrypcji może również zastąpić jego kontekst. Jeśli jednak zarówno zadanie zagnieżdżone, jak i jego element nadrzędny należą do tego samego kontekstu, tylko najbardziej zewnętrzne wywołanie Context::Oversubscribe
powoduje utworzenie dodatkowego wątku.
Uwaga
Środowisko uruchomieniowe zgłasza współbieżność::invalid_oversubscribe_operation , jeśli zasubskrypcja jest wyłączona przed włączeniem.
Przykład
Przykład, który używa przesubskrypcji, aby zrównoważyć opóźnienie spowodowane odczytem danych z połączenia sieciowego, zobacz How to: Use Oversubscription to Offset Latency (Jak użyć przesubskrypcji do przesunięcia opóźnienia).
Zobacz też
Harmonogram zadań
Instrukcje: używanie grup harmonogramu do wywierania wpływu na kolejność wykonywania
Instrukcje: korzystanie z klasy kontekstu do wdrażania a kooperatywnego semafora
Instrukcje: używanie nadsubskrypcji do przesuwania opóźnienia