C ++ stdmutex/

C ++ stdmutex/
Korzystając z słowa kluczowego Mutex, możemy zablokować naszą zmienną dostęp do kilku wątków jednocześnie. Mutex jest wykorzystywany do zapewnienia synchronizacji w C ++, co oznacza, że ​​tylko jeden wątek może odbierać obiekt jednocześnie. Wątki nie mogą uzyskać dostępu do zablokowanego kawałka kodu po ustaleniu zamka. Kod został zablokowany za pomocą mutexes. Tak więc, nawet jeśli Thread 2 jest zaplanowane, gdy Thread 1 nadal zużywa wspólny zasób, Wątek 2 nie będzie w stanie uzyskać dostępu do tej części kodu. W rezultacie zapewnia się zsynchronizowany dostęp do wspólnych zasobów w kodzie.

Działanie Mutex w C++

Rozważ sytuację, w której jeden wątek uruchamia rozdział kodu, który Mutex zablokował. Teraz, jeśli harmonogram zdecyduje się zmienić kontekst, wszystkie pozostałe wątki przygotowane do wykonania tej samej strefy są odblokowane. Tylko jeden wątek ze wszystkich pozostałych byłby w stanie to osiągnąć, ale gdyby ten wątek próbował wykonać zablokowaną część kodu, znów pójdzie spać.

Będą powtarzane przełączniki kontekstowe, ale do momentu uwolnienia blokady Mutex przez zablokowaną sekcję kodu, żaden wątek nie będzie w stanie go wykonać. Wątek, który zablokował mutex, nie może go zwolnić.

Dlatego upewnia się, że gdy wątek zablokuje część kodu, żaden inny wątek nie może wykonać tego regionu, dopóki zablokowany wątek go nie odblokuje.

Tak więc, funkcjonując na wspólnych zasobach, ten system zapewnia zsynchronizowane wątki.

Wzywając dwie następujące funkcje, inicjalizuje się mutex, a następnie osiąga się zamek: Pierwsza metoda inicjuje mutex, a druga funkcja umożliwia blokowanie dowolnej kluczowej części kodu.

# Int pthread_mutex_init (pThread_Mutex_tryLock *ogranicz mutex, const pthread_mutexattribute_trylock *ogranicz atrybut):
Dostarcza mutax z cechami zdefiniowanymi przez atrybut i odniesienie do innego mutx. Domyślna właściwość Mutex (nierekurencyjna) jest wykorzystywana, jeśli atrybut jest zerowy. Jeśli Pthread Mutex init () odniesie sukces, zwraca 0 i inicjuje i odblokowuje stan Mutex. Pthread mutex init () zwraca -1, jeśli nie jest to niepowtarzalne.

# int pthread_mutex_lock (pthread_mutex_trylock *mutex):
Klasyfikuje mutax i blokuje obiekt mutex. Istniejący wątek powinien poczekać, aż mutex odblokuje się, jeśli został wcześniej zablokowany przez inny wątek. Mutex jest zablokowany przez wątek, który go zablokował, a ten wątek nadal jest właścicielem Mutex, dopóki ten wątek go odblokuje. Sposób, w jaki stosuje się blokadę, może się różnić w zależności od tego, czy mutex ma charakterystykę rekurencyjną, czy nie. Gdy ten sam wątek blokuje ten sam typ mutx więcej niż raz, liczba jest zwiększona i nie powstaje żaden wątek oczekiwania.

Aby zmniejszyć liczbę na zero, wątek właścicielem musi wykonać równą liczbę połączeń z pthread_mutex_unlock ().Jeśli się powiedzie, funkcja pthread_mutex_lock () zwraca 0. Pthread_mutex_lock () zwraca -1, jeśli się nie powiedzie.

Wykonując dwa wskazane poniżej działania, mutex można odblokować i zniszczyć. Zamek można otworzyć za pomocą pierwszej techniki i można ją również zniszczyć, aby nie można go było używać w przyszłości.

# int pthread_mutex_unlock (pthread_mutex_trylock *mutex):
Obiekt Mutex jest uwalniany. Jeśli kilka lub więcej wątków w kolejce, aby zablokować mutex, pthread mutex odblokowanie () zmusza do tego jeden z wątków. Zmusza go również do ucieczki od Pthread Mutex Lock () z obiektem, który otrzymał wcześniej. Mutex odblokowuje się, chyba że nie czeka żadne wątki i obecnie nie ma właściciela. Zastosowanie zamka może się zmienić, jeśli mutex ma charakterystykę rekurencyjną.

Gdy ten sam wątek blokuje dany mutex więcej niż jeden raz, liczba jest zmniejszona po odblokowaniu i nie jest tworzona wątek oczekiwania, aby utrzymać zamek. Mutex jest usunięty, a wszelkie wątki oczekiwania są publikowane, jeśli odliczanie jest do zera. Pthread_mutex_unlock () zwraca 0, jeśli się powiedzie. Pthread_mutex_unlock () zwraca -1 w przypadku awarii.

int pThread_Mutex_Destroy (pthread_mutex_trylock *mutex): Usuwa obiekt Mutex. Czasami jest to określane jako identyfikator muteksu z systemu. Mutexes są wykorzystywane do ochrony wspólnych zasobów. Mutex jest inicjowany z błędną wartością, ale PTHREAD MUTEX IIT pozwala na ponowną inicjowanie (). Udana wartość zwracana pthread_mutex_destroy () wynosi 0. Pthread_mutex_destroy () zwraca -1 w przypadku awarii.

Przykład mutex w C++

Ilustracja sposobu, w jaki synchronizacja wątków jest realizowana za pomocą muteksów.

Tutaj najpierw podaliśmy rozmiar identyfikatora wątku „3”. Następnie zainicjowaliśmy licznik zmienny, który rejestruje częstotliwość z uruchamianymi wątkami. Następnie utworzyliśmy blokadę obiektu dla pthread_mutex_lock. Następnie ustanowiliśmy funkcję „mutex_func”, w której wzięliśmy odniesienie do blokady i zainicjowaliśmy zmienną „M” z zero. Wartość przyrostowa jest wprowadzana do zmiennej licznika.

Teraz zdefiniowaliśmy główną funkcję tego skryptu. Dwie zmienne są zadeklarowane, jedna dla Mutex jako „M” i jedna dla niepowodzenia Mutex jako „błędu”. Gdy metoda „Mutex func ()” używa wspólnego „licznika” zasobów, ten sam Mutex jest zablokowany. Identyczny mutex jest odblokowywany po funkcji „MUTEX_FUNC ()”. Mutex jest usuwany po zakończeniu oba wątków główną funkcją. Zauważ, że wykonuje się odpowiednio tylko dwa zadania.

W wyjściu można zauważyć, że rozpoczął się jeden wątek. Po tym, jak działający wątek nie zostanie zniszczony, inne zadanie, które nie rozpoczęło się, jest zadaniem. Dlatego obiekty rozpoczynające się i końcowe są obecne tym razem. Zatem użycie synchronizacji wątków włączonych Mutex.

Wniosek

Możemy zablokować obiekt zawierający podstawową funkcjonalność naszej aplikacji za pomocą mutex. Ponadto pozwala to uniknąć niespójnych danych, co jest kluczowe dla aplikacji w czasie rzeczywistym. Na przykład wdrażanie synchronizacji w innych językach programowania, Mutex jest stosowany. Uwzględniliśmy przykład, aby wyjaśnić koncepcję std :: Mutex w języku programowania C ++.