2011-01-20 10 views
15

Zastanawiam się, jakie są zalety wydajności wynikające z używania zmiennych warunkowych przez blokady mutex w pthreads.Zalety używania zmiennych warunkowych przez mutex

Co znalazłem to: "Bez zmiennych warunkowych programista musiałby mieć ciągłe pollingy wątków (prawdopodobnie w sekcji krytycznej), aby sprawdzić, czy warunek jest spełniony. Może to być bardzo kosztowne, ponieważ wątek byłby jest ciągle zajęty w tej czynności. Zmienna warunkowa to sposób na osiągnięcie tego samego celu bez odpytywania. " (https://computing.llnl.gov/tutorials/pthreads)

Wygląda jednak na to, że wywołania mutex są blokowane (inaczej niż w przypadku spin-lock). Stąd, jeśli wątek (T1) nie może uzyskać blokady, ponieważ inny wątek (T2) ma blokadę, T1 jest uśpiony przez system operacyjny i jest budzony tylko wtedy, gdy T2 zwalnia blokadę, a system operacyjny daje T1 blokadę. Wątek T1 tak naprawdę nie sonduje, aby uzyskać blokadę. Z tego opisu wynika, że ​​nie ma żadnej korzyści z wydajności używania zmiennych warunkowych. W obu przypadkach nie ma udziału w głosowaniu. System operacyjny i tak zapewnia korzyści, jakie może zapewnić paradygmat warunkowo-zmienny.

Czy możesz wyjaśnić, co się właściwie dzieje.

Odpowiedz

32

Zmienna warunku umożliwia sygnalizowanie wątku, gdy występuje coś interesującego dla tego wątku.

Sama mutex tego nie robi.

Jeśli potrzebujesz tylko wzajemnego wykluczenia, zmienne warunkowe nic dla ciebie nie zrobią. Jeśli jednak potrzebujesz wiedzieć, kiedy coś się dzieje, pomocne mogą być zmienne warunkowe.

Na przykład, jeśli masz kolejkę elementów do pracy, będziesz mieć muteks, aby zapewnić, że wewnętrzne elementy kolejki są spójne, gdy dostęp do nich mają różne wątki producenta i konsumenta. Jednak, gdy kolejka jest pusta, w jaki sposób wątek konsumenta będzie wiedział, kiedy coś jest na nim, aby działało? Bez czegoś takiego jak zmienna warunku musiałaby odpytać kolejkę, biorąc i zwalniając muteks w każdej ankiecie (w przeciwnym razie wątek producenta nigdy nie mógłby umieścić czegoś w kolejce).

Używanie zmiennej warunkowej pozwala konsumentowi stwierdzić, że gdy kolejka jest pusta, może po prostu poczekać na zmienną warunku wskazującą, że w kolejce coś zostało w niej umieszczone. Brak odpytywania - wątek nie robi nic, dopóki producent nie umieści czegoś w kolejce, a następnie sygnalizuje, że kolejka ma nowy element.

+5

prawo. Mutex pozwala tylko czekać, aż blokada będzie dostępna; zmienna warunku pozwala ci czekać, aż zmieni się jakiś warunek zdefiniowany przez aplikację. – caf

+0

Dziękuję za przykład! Oczyściłem rzeczy :) – Abhi

+6

Nie rozumiem, dlaczego nie można upuścić zmiennej warunku i po prostu użyć muteksa w kilku prostych przypadkach. Zdobądź mutex w stanie "praca jest dostępna". Następnie pozwól, aby wątek producenta przejął muteks, a wątek roboczy spróbuje go zdobyć. Kiedy praca jest dostępna, producent odblokowuje muteks. Następnie system operacyjny obudzi pracownika z nabytym muteksem, a pracownik przejdzie do końca, a następnie zasnął (samo zakleszczenie), próbując ponownie pozyskać własny muteks. Gdy producent ma więcej pracy, może odblokować muteks. Może być konieczne sprawdzenie, czy muteks jest najpierw zablokowany. – Eloff

4

Poszukujesz zbyt dużego nakładania się w dwóch osobnych, ale pokrewnych rzeczach: muteks i zmienna warunku.

Powszechnie stosowane podejście do mutex polega na użyciu flagi i kolejki. Flaga wskazuje, czy muteks jest przechowywany przez nikogo (działałby też semafor z jednym rachunkiem), a kolejka śledzi, które wątki oczekują tylko na nabycie muteksu.

Zmienna warunkowa jest następnie zaimplementowana jako kolejna kolejka przykręcona do tego muteksu. Wątki, które czekają, aby przejąć muteks, mogą — zwykle po tym, jak je uzyskają, aby uzyskać wyjście z linii i dostać się do kolejki warunku.W tym momencie masz dwa osobne zestawy kelnerów:

  • oczekujących nabyć mutex wyłącznie
  • Tych czeka na zmiennej warunkowej być sygnalizowane

Gdy gwint trzyma wyłącznie mutex sygnalizuje zmienną warunku, dla której przyjmiemy, że jest to pojedynczy sygnał (uwolnienie nie więcej niż jeden oczekujący wątek), a nie broadcast (uwolnienie wszystkich oczekujących wątków), pierwszy wątek w zmiennej warunku kolejka zostaje przesunięta z powrotem do przodu (zwykle) kolejki mutex. Gdy gwint obecnie mutex — zazwyczaj z nici, która jest sygnalizowane zmienna stanu — zrzeka muteksu następny gwint w kolejce mutex można ją nabyć. Kolejnym wątkiem w linii będzie ten, który znajdował się na czele kolejki zmiennych warunkowych.

Istnieje wiele skomplikowanych szczegółów, które wchodzą w grę, ale ten szkic powinien dać wyczucie struktur i działań w grze.

+0

Zmienne pthreads mutexes i warunki są jeszcze prostsze - nie ma kolejki, tylko nieuporządkowany zestaw procesów oczekiwania. – caf

+1

Kiedy nadszedł czas, aby wybrać "następny" w przypadku * signal *, jeden z nich będzie "pierwszy", więc zestaw musi być rzutowany na sekwencję. Rozumiem, że nie ma gwarancji FIFO, chociaż z pewnością można zbudować parę muteksów/warunków, która czyni tę gwarancję. Śledź różne "uczciwe" implementacje przestrzeni użytkownika dla Win32. – seh

+0

Dziękujemy! I zrozumieć podstawowe pojęcia, że ​​zmienne warunek nie są naprawdę inny sposób wdrożyć blokad mutex, ale stanowią one struktury sygnalizacji lepiej zarządzać podziału zamka wśród konkurencyjnych wątków .. – Abhi

5

Jeśli szukasz wydajności, a następnie zacznij czytać o „non blokowanie/non blokujących” algorytmów synchronizacji wątków. Oparte są na operacjach atomowych, które są na tyle miłe, aby je zapewnić. Wyszukaj operacje atomowe gcc. Nasze testy wykazały, że możemy zwiększyć wartość globalną z wieloma wątkami, używając wielkości operacji atomowych szybciej niż blokowanie za pomocą muteksu. Here is some sample code that shows how to add items to and from a linked list from multiple threads at the same time without locking.

do spania i czuwania wątków, sygnały są znacznie szybsze niż warunkach. Używasz pthread_kill, aby wysłać sygnał, i sigwait, aby przespać wątek. Testowaliśmy to również przy takich samych korzyściach związanych z wydajnością. Here is some example code.

+0

Bardzo dziękuję za wskazanie obszaru nie- synchronizacja blokowania! Patrzę teraz na to! – Abhi

+0

Dobra wskazówka dotycząca używania sygnałów zamiast zmiennych warunkowych. – Eloff

Powiązane problemy