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::Unblocki do implementowania klasy semafora kooperatywnego, zobacz How to: Use the Context::BlockContext 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