2010-10-22 12 views
5

Chodzi głównie o zrozumienie pojęcia, które mnie wprawia w zakłopotanie.Model producenta-konsumenta - semafor binarny lub mutex?

Mutex oznacza, że ​​jeden wątek wykonuje kontrolę dostępu współdzielonego zasobu, wykonuje operacje i odblokowuje go, to tylko inny wątek może uzyskać dostęp do zablokowania

podczas binarny semafor jest jak wątek może uzyskać dostęp do współdzielonych zasobów, ale zyskuje dostęp do zamka, podczas gdy inny wątek może go odblokować

w ostatnim pytaniu, które widziałem nad here, wspomniano, że "semaphores are more suitable for some synchronization problems like producer-consumer".

Moje pytanie dotyczy na przykład, czy wątek producenta zyskał blokadę i zapełnił jakąś kolejkę danymi, a konsument jednocześnie ją odblokuje, czy nie ma problemu z współbieżnością?

Odpowiedz

11

Postaram się rozwiązać zamieszanie najlepiej jak potrafię. Wyjaśnię te pojęcia w sposób, w jaki są one tradycyjnie zdefiniowane. Problem polega na tym, że ludzie zaczynają mieszać znaczenie wielu z tych koncepcji i powstaje z tego wiele nieporozumień.

Ilekroć mamy fragment kodu, który modyfikuje trochę pamięci (powiedzmy zmienną), która jest dzielona między różne procesy lub wątki, mamy krytyczną sekcję. Jeśli nie będziemy uważać, aby poprawnie zsynchronizować ten fragment kodu, otrzymamy błędy. Jednym z przykładów sekcji krytycznej jest producent, który dodaje element do jakiegoś współdzielonego kontenera.

Jednym ze sposobów synchronizacji krytycznych sekcji jest wymuszenie wzajemnego wykluczenia. Wzajemne wykluczanie oznacza, że ​​tylko jeden proces lub wątek na raz może wykonać sekcję krytyczną i uzyskać dostęp do współużytkowanej części pamięci. Zwróć uwagę, że wzajemne wykluczanie nie jest mechanizmem samo w sobie, jest to zasada, którą możemy egzekwować na różne sposoby. Niektórzy mówią o blokadach i semaforach binarnych jako muteksach, ale to miesza koncepcje w sposób, który doprowadzi do zamieszania.

A semafor binarny to sposób na wymuszenie wzajemnego wykluczenia. Za każdym razem, gdy proces chce uzyskać dostęp do muteksa, może on nabyć semafor. Ta operacja zostanie zablokowana, jeśli w danym momencie istnieje inny proces trzymający semafor. Stąd mamy wzajemne wykluczenie. Gdy proces zostanie zakończony za pomocą muteksu, zwalniamy semafor, pozwalając innym procesom na muteks. W ten sposób możemy osiągnąć wzajemne wykluczenie za pomocą semafora binarnego, ale nie jest to jedyna możliwa aplikacja semafora binarnego.

Semafory są dobre dla problemów producent-konsument, ponieważ mogą przyjąć dowolną liczbę naturalną, a nie tylko 0 i 1 w przypadku semaforów binarnych. Jest to bardzo przydatne przy synchronizowaniu problemów producent-konsument, ponieważ można pozwolić, aby wartość semafora zawierała liczbę dostępnych elementów. Jeśli liczba elementów spadnie do zera, operacje semaforów zostaną automatycznie zablokowane.

Zdaję sobie sprawę, że wyjaśnienie problemu producent-konsument jest trochę krótkie i zachęcam do przyjrzenia się rozwiązaniom, które używają semaforów, a także porównania tych rozwiązań z innymi rozwiązaniami, które używają innych konstrukcji synchronizujących, takich jak monitory lub przekazywanie wiadomości. Odkryłem, że to bardzo pouczające.