Konteksty
Niniejszy dokument opisuje rolę kontekstów w czasie wykonywania współbieżności.Wątek, który jest dołączony do harmonogramu jest znany jako kontekst wykonywania, lub po prostu kontekst.Concurrency::wait funkcji i concurrency::Context klasy pozwalają kontrolować zachowanie kontekstów.Użyj wait funkcji zawiesić bieżący kontekst na określony czas.Użyj Context klasy, gdy potrzeba więcej kontroli nad podczas blokowanie, odblokowywanie i plon w kontekstów lub kiedy chcesz oversubscribe bieżącego kontekstu.
Porada |
---|
Runtime współbieżności zawiera harmonogram domyślny, a więc nie trzeba utworzyć w aplikacji.Ponieważ Harmonogram zadań umożliwia dostosowywanie wydajności aplikacji, firma Microsoft zaleca uruchamiania z Biblioteka desenie równoległe (PPL) lub Biblioteka agentów asynchroniczne , jeśli jesteś nowym Runtime współbieżności. |
Funkcja oczekiwania
Concurrency::wait funkcja daje wspólnie wykonanie bieżący kontekst na określoną liczbę milisekund.Środowisko wykonawcze używa czasu wydajności do innych zadań.Po upływie określonego czasu wykonywania dokonało kontekst dla realizacji.W związku z tym wait funkcji może zawiesić dłuższy niż wartość podana dla bieżącego kontekstu milliseconds parametru.
Przekazując 0 (zero) dla milliseconds parametr powoduje runtime do zawieszenia bieżącego kontekstu, dopóki wszystkie konteksty aktywne są możliwość wykonywania pracy.Umożliwia to plon zadania, wszystkie aktywne zadania.
Przykład
Na przykład, że korzysta z wait funkcji plon bieżącego kontekstu, a zatem umożliwić innych kontekstach, uruchamianie, zobacz Jak: Użyj harmonogramu grupy kontrolować kolejność wykonywania.
Klasa kontekstu
Concurrency::Context klasy zapewnia programowania abstrakcji w kontekście realizacji i oferuje dwie ważne funkcje: możliwość wspólnie blokowanie, odblokowywanie i plon bieżącego kontekstu i możliwość oversubscribe bieżącego kontekstu.
Blokowanie współpracy
Context Klasa pozwala zablokować lub plon bieżący kontekst wykonywania.Blokowanie lub nadającego jest użyteczna podczas bieżącego kontekstu nie może kontynuować, ponieważ zasób jest niedostępny.
Concurrency::Context::Block metoda blokuje bieżącego kontekstu.Kontekst, który jest zablokowany plony jej zasoby przetwarzania tak, aby środowisko wykonawcze mogą wykonywać inne zadania.Concurrency::Context::Unblock metoda odblokowuje zablokowany kontekstu.Context::Unblock Metoda musi być wywołana z inny kontekst niż o nazwie Context::Block.Generuje runtime concurrency::context_self_unblock Jeśli kontekst próbuje samodzielnie odblokować się.
Wspólnie blokowanie i odblokowywanie kontekst, zazwyczaj call concurrency::Context::CurrentContext pobrać wskaźnika do Context obiekt, który jest skojarzony z bieżącym wątkiem i zapisz wynik.Następnie wywołać Context::Block metoda zablokować bieżącego kontekstu.Później, call Context::Unblock z oddzielnych kontekstu odblokowania zablokowanych kontekstu.
Musi odpowiadać każdej pary wywołania Context::Block i Context::Unblock.Generuje runtime concurrency::context_unblock_unbalanced po Context::Block lub Context::Unblock wywoływana jest metoda kolejno bez dopasowania wywołania do innej metody.Jednakże, nie trzeba wywołać Context::Block przed wywołaniem Context::Unblock.Na przykład, jeśli jeden kontekst wywołuje Context::Unblock przed innego kontekstu wywołania Context::Block w tym samym kontekście tego kontekstu pozostaje odblokowana.
Concurrency::Context::Yield metoda daje wykonanie tak, aby środowisko wykonawcze można wykonywać inne zadania, a następnie ponownie kontekst dla realizacji.Po wywołaniu Context::Block metoda, środowisko wykonawcze nie harmonogramu w kontekście.
Przykład
Na przykład, że korzysta z Context::Block, Context::Unblock, i Context::Yield metod, aby zaimplementować klasę semafora współpracy, zobacz Jak: klasa kontekstu służy do wprowadzenia w życie wspólnych semafora.
Nadsubskrypcji
Harmonogram domyślny tworzy taką samą liczbę wątków, jak wątki dostępnego sprzętu.Można użyć nadsubskrypcji do tworzenia dodatkowych wątków dla wątku danego sprzętu.
Dla operacji intensywnych obliczeniowo nadsubskrypcji zazwyczaj nie jest skalowany, ponieważ wprowadza ono dodatkowe obciążenie.Jednakże dla zadania, które mają dużą ilość czasu oczekiwania, na przykład odczytywania danych z dysku lub połączenie sieciowe nadsubskrypcji można poprawa ogólnej efektywności niektórych aplikacji.
[!UWAGA]
Włącz nadsubskrypcji tylko z wątku, który został utworzony przez program obsługi współbieżności.Nadsubskrypcji nie ma wpływu, gdy zostanie wywołana z wątku, który nie został utworzony przez program obsługi (w tym wątku głównego).
Aby włączyć nadsubskrypcji w bieżącym kontekście, wywołanie concurrency::Context::Oversubscribe metody z _BeginOversubscription ustawiono parametr true.Po włączeniu nadsubskrypcji w wątku, który został utworzony przez program obsługi współbieżności powoduje runtime utworzyć jeden wątek dodatkowe.Po wszystkich zadań, które wymagają Zakończ nadsubskrypcji, call Context::Oversubscribe z _BeginOversubscription ustawiono parametr false.
Można włączyć nadsubskrypcji wiele razy z bieżącego kontekstu, ale należy wyłączyć samą liczbę razy, które należy go włączyć.Mogą być również zagnieżdżone nadsubskrypcji; oznacza to, że zadania utworzonego przez innego zadania, który korzysta z nadsubskrypcji można oversubscribe jego kontekstem.Jednakże jeżeli zarówno nadrzędnego, jak i zagnieżdżonych zadania należą do tym samym kontekście, wywołanie peryferyjnych do Context::Oversubscribe powoduje utworzenie dodatkowych wątków.
[!UWAGA]
Generuje runtime concurrency::invalid_oversubscribe_operation Jeśli nadsubskrypcji jest wyłączona, zanim jest ona włączona.
Przykład
Na przykład, korzystającej z nadsubskrypcji do zrównoważenia opóźnienia powodowanego przez odczyt danych z połączenia sieciowego, zobacz Jak: przesunięcie czasu oczekiwania za pomocą Nadsubskrypcji.
Zobacz też
Zadania
Jak: Użyj harmonogramu grupy kontrolować kolejność wykonywania
Jak: klasa kontekstu służy do wprowadzenia w życie wspólnych semafora
Jak: przesunięcie czasu oczekiwania za pomocą Nadsubskrypcji