Udostępnij za pośrednictwem


<condition_variable>

Definiuje klasy condition_variable i condition_variable_any używane do tworzenia obiektów, które oczekują, aż warunek stanie się spełniony.

Ten nagłówek używa środowiska uruchomieniowego współbieżności (ConcRT), aby można było go używać razem z innymi mechanizmami ConcRT. Aby uzyskać więcej informacji na temat środowiska ConcRT, zobacz Środowisko uruchomieniowe współbieżności.

Wymagania

Nagłówek:<condition_variable>

Przestrzeń nazw: std

Uwaga

W kodzie skompilowanym przy użyciu / clr ten nagłówek jest blokowany.

Uwagi

Kod, który czeka na zmienną warunku, musi również używać zmiennej mutex. Wątek wywołujący musi zablokować mutex element przed wywołaniem funkcji, które oczekują na zmienną warunku. Element mutex jest następnie blokowany, gdy wywołana funkcja zwraca wartość . Element mutex nie jest zablokowany, gdy wątek czeka, aż warunek stanie się prawdziwy. Aby nie było nieprzewidywalnych wyników, każdy wątek, który czeka na zmienną warunku, musi używać tego samego mutex obiektu.

Obiekty typu condition_variable_any mogą być używane z mutexem dowolnego typu. Typ używanego mutexu nie musi podawać try_lock metody. Obiekty typu condition_variable mogą być używane tylko z mutex typu unique_lock<mutex>. Obiekty tego typu mogą być szybsze niż obiekty typu condition_variable_any<unique_lock<mutex>>.

Aby poczekać na zdarzenie, najpierw zablokuj mutex, a następnie wywołaj jedną z wait metod w zmiennej warunku. Wywołanie wait blokuje się, dopóki inny wątek nie sygnalizuje zmiennej warunku.

Fałszywe wznawianie występuje, gdy wątki oczekujące na zmienne warunku stają się odblokowane bez odpowiednich powiadomień. Aby rozpoznać takie fałszywe wznawianie, kod, który czeka na warunek, aby stał się prawdziwy, powinien jawnie sprawdzić ten warunek, gdy kod powraca z funkcji wait. Zwykle odbywa się to przy użyciu pętli; Możesz użyć wait(unique_lock<mutex>& lock, Predicate pred) polecenia , aby wykonać tę pętlę.

while (condition is false)
    wait for condition variable;

Klasy condition_variable_any i condition_variable mają trzy metody oczekiwania na warunek.

  • wait czeka na niezwiązany okres.

  • wait_until czeka do określonego time.

  • wait_for czeka na określony time intervalelement .

Każda z tych metod ma dwie przeciążone wersje. Jeden po prostu czeka i może obudzić się złudnie. Drugi przyjmuje dodatkowy argument szablonu, który definiuje predykat. Metoda nie zwraca się do momentu, gdy predykat ma wartość true.

Każda klasa ma również dwie metody, które są używane do powiadamiania zmiennej warunku, że jej warunek to true.

  • notify_one Budzi się jeden z wątków, które czekają na zmienną warunku.

  • notify_all Budzi się wszystkie wątki, które czekają na zmienną warunku.

Funkcje i wyliczenia

void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);

enum class cv_status { no_timeout, timeout };

Zobacz też

Odwołanie do plików nagłówka
condition_variable, klasa
condition_variable_any, klasa