2015-05-12 28 views
11

Zmienne warunku są jednym z aspektów C++ 11 Nadal borykam się z problemem. Z tego, co zebrałem, zmienna warunku jest bardzo podobna do semafora.Dlaczego zmienna warunku potrzebuje blokady (a zatem i muteksu)?

Ale potem znowu, semafor nie potrzebuje blokady do działania. Zmienna warunku ma. Z kolei blokada wymaga muteksu. Aby więc korzystać z dość prostej funkcjonalności semafora, musimy teraz nie tylko zarządzać zmienną warunku. Ale także muteks i blokada.

Dlaczego więc zmienna warunku tego wymaga? A jakie dodatkowe funkcje zapewnia dodanie tego wymagania?

+1

Muteks to blokada. Blokada klasy wątków jest po prostu opakowaniem RAII wokół muteksu, więc nie jest zarządzana, ale używana lokalnie. – stefaanv

+0

Powiązane [Dlaczego funkcje zmiennych warunku pthreads wymagają muteksu?] (Http://stackoverflow.com/q/2763714/2069064) – Barry

+0

Stycznie powiązane: Możesz implementować semafory w kategoriach muteksów i zmiennych warunków dość łatwo. Zmienne warunku to tylko inny prymityw czasu oczekiwania; znacznie ułatwiają oczekiwanie na ogólne, wyrażone w kodzie użytkownika warunki. – Mark

Odpowiedz

6

Zmienne stanu są zwykle używane do sygnalizowania zmiany stanu. Zazwyczaj do wykonania tej zmiany potrzebny jest muteks i następujący sygnał, atomowy.

Semafor zawiera pewien stan (flaga lub licznik) wraz z mechanizmem sygnalizacyjnym. Zmienna warunku jest bardziej prymitywna, tylko dostarczająca sygnał.

+2

Przynajmniej w C++, nie ma potrzeby ochrony sygnalizacji za pomocą blokady. W rzeczywistości, w zależności od tego, w jaki sposób implementacja obsługuje harmonogram oczekujących wątków, wykonanie sygnalizacji wewnątrz blokady może być szkodliwe dla wydajności. Chociaż istnieją pewne warunki, w których logika programu może polegać na tym, że zmiana stanu i sygnalizacja odbywają się w sposób atomowy, to nie jest ogólnie prawdziwe, gdy używana jest zmienna warunku. – ComicSansMS

+0

Czy nie jest odwrotnie? Zmienną warunku jest semafor na muteksie.Wskazuje, czy muteks jest znowu dostępny? Uczynienie semafora bardziej prymitywnym. – laurisvr

+0

@laurisvr: Nie, semafor łączy flagę atomową/licznik z sygnałem, więc nie jest prymitywny. Zmienna warunkowa jest po prostu sygnałem, który zwykle używasz w połączeniu z inną rzeczą, której zmiany stanu chcesz sygnalizować. –

4

Generalnie, gdy już zasygnalizujesz, że coś się zmieniło (przez zmienną warunku), potrzebujesz kodu, który będzie działał, aby obsłużyć tę zmianę, i który kod musi bezpiecznie odczytać zmienione dane. Jeśli nie masz blokady powiązanej z cv, to twój wątek czekający na cv może się obudzić, wtedy spróbuj (i nie powiodło się), aby zdobyć blokadę związaną z danymi, a zatem musisz ją ponownie uzyskać. Z kombinacją CV/Lock system bazowy może obudzić twój wątek tylko wtedy, gdy wątek może uzyskać odpowiednią blokadę jako jednostkę, a więc być bardziej wydajny.

Jest to mało prawdopodobne, aby samo CV było użyteczne, ponieważ nie zawiera żadnych danych powyżej faktu, że zostało zasygnalizowane. Jeśli wyobrazisz sobie zastosowania cv - takie jak lista bezpiecznych wątków z producentami i konsumentami, masz zmienne reprezentujące {list, cv, lock}. W takim przypadku weź blokadę, zmodyfikuj listę, zwolnij blokadę, a następnie skieruj cv. Na twoim wątku konsumenckim najprawdopodobniej będziesz potrzebował wziąć blokadę raz sygnalizowaną do działania na liście, więc posiadanie blokady po przebudzeniu z sygnalizowanego CV jest dobrą rzeczą.

Spójrz na coś podobnego do wydarzeń w oknach (:: CreateEvent), które są cv-ami bez niejawnej blokady, przez wiele czasu będą miały blokadę z nimi związaną, ale po prostu nie wbudowane w rzeczywiste użycie.

Mimo że nie jest to pierwotny powód, dla którego stworzono zmienną warunkową w pthreads (użyli blokady do ochrony samego cv, która nie jest już potrzebna w języku C++), przyczyna i użyteczność blokad z cv została przeniesiona na to, co jest w tym odpowiedź.