Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałNastusia Krukowski Został zmieniony 10 lat temu
1
Bariery synchronizacyjne Bariery są obiektami synchronizacyjnymi pakietu pthread służącymi do wyrównywania czasów pracy wątków wykonujących wspólne zadanie obliczeniowe, przed przejściem do kolejnego etapu tego zadania. start koniec I etapu koniec II etapu... wątek 1 wątek 2..... wątek n t Dojście do bariery ostatniego wątku w zespole powoduje uwolnienie wszystkich wątków i jednoczesne podjęcie przez nie pracy na kolejnym etapie przetwarzania.
2
Bariery nie identyfikują poszczególnych wątków wchodzących w skład danego zespołu – potrafią jedynie liczyć wątki dochodzące do bariery (czyli wywołujące odpowiednią funkcję po zakończeniu danego etapu obliczeń). int pthread_barrier_init (pthread_barrier_t *bariera, const pthread_barrierattr_t *atrybuty, unsigned int licznik); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu bariera – wskaźnik na inicjowaną barierę atrybuty – wskaźnik na obiekt atrybutów (jeśli jest NULL, przyjmowane są atrybuty domyślne) licznik – liczba wątków, które mają być zsynchronizowane przez barierę Działanie: inicjuje barierę i ustawia jej licznik. Uwaga: działanie funkcji jest nieokreślone, jeśli bariera już wcześniej została zainicjowana.
3
int pthread_barrier_wait (pthread_barrier_t *bariera); Zwraca: w przypadku sukcesu wartość PTHREAD_BARRIER_SERIAL_THREAD jednemu (losowo wybranemu) wątkowi, a 0 wszystkim pozostałym dodatni kod w przypadku błędu bariera – wskaźnik na (zainicjowaną) barierę Działanie: zawiesza wywołujący wątek, jeśli liczba wątków, które wywołały tę funkcję w odniesieniu do danej bariery, nie osiągnęła jeszcze wartości licznika. Jeśli bieżące wywołanie było ostatnim brakującym, uwalnia wszystkie zawieszone wątki i przywraca barierę do stanu, jaki miała po ostatnim (chronologicznie) wywołaniu funkcji pthread_barrier_init ( ). Uwaga: Zwrócenie innej, niż 0, wartości jednemu z uwolnionych wątków umożliwia zniszczenie bariery i ewentualne ponowne zainicjowanie jej innymi parametrami tylko jednemu wątkowi.
4
int pthread_barrier_destroy (pthread_barrier_t *bariera); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu bariera – wskaźnik na (zainicjowaną) barierę Działanie: jeśli pod barierą nie jest zawieszony żaden wątek, zwalnia zasoby związane z daną barierą, (jeśli były one przydzielone dynamicznie), w przeciwnym przypadku zwraca błąd. Uwaga: działanie funkcji nie jest zdefiniowane, jeśli bariera nie została wcześniej zainicjowana.
5
Blokady zapisu/odczytu Blokady zapisu/odczytu są mechanizmami synchronizacji wątków przeznaczonymi do implementacji rozwiązań problemu czytelników i pisarzy. Wbrew temu, co mogłaby sugerować ich nazwa, nie mają bezpośrednio nic do czynienia z operacjami wejścia/wyjścia w programie, a jedynie stanowią swojego rodzaju uogólnienie pojęcia semafora. Wątki pełniące rolę czytelników lub pisarzy w programie nie posiadają żadnych atrybutów, na podstawie których blokada mogłaby je rozróżnić – różnią się jedynie rodzajami wywoływanych funkcji. Ogólna zasada działania blokady jest następująca: - blokadę może zamknąć wielu czytelników (zachowuje się ona wtedy tak, jak muteks rekurencyjny), ale tylko jeden pisarz (zachowuje się ona wtedy tak, jak muteks szybki); - każde otwarcie blokady uwalnia spod niej jeden wątek (jeśli były pod nią jakieś zablokowane, jeśli nie było, blokada pozostaje otwarta); - jeśli wśród zablokowanych wątków są zarówno czytelnicy, jak i pisarze, pierwszeństwo mają pisarze.
6
int pthread_rwlock_init (pthread_rwlock_t *blokada, const pthread_rwlockattr *atrybuty); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu blokada – wskaźnik na blokadę zapisu/odczytu atrybuty – wskaźnik na obiekt atrybutów (jeśli jest NULL, przyjmowane są atrybuty domyślne) Działanie: inicjuje blokadę zapisu/odczytu. int pthread_rwlock_rdlock (pthread_rwlock_t *blokada); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu blokada – wskaźnik na (zainicjowaną) blokadę
7
Działanie: rejestruje w blokadzie zamknięcie, jeśli blokada była otwarta lub zamknięta wcześniej przez czytelników; zawiesza wątek pod blokadą, jeśli blokada była wcześniej zamknięta przez pisarza. int pthread_rwlock_wrlock (pthread_rwlock_t *blokada); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu blokada – wskaźnik na (zainicjowaną) blokadę Działanie: zamyka blokadę, jeśli była wcześniej otwarta; zawiesza wątek pod blokadą, jeśli blokada była wcześniej zamknięta (przez czytelników lub przez pisarza). Uwaga: funkcje pthread_rwlock_rdlock ( ) i pthread_rwlock_wrlock ( ) mają swoje nieblokujące odpowiedniki pthread_rwlock_tryrdlock ( ) i pthread_rwlock_trywrlock ( ).
8
int pthread_rwlock_unlock (pthread_rwlock_t *blokada); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu blokada – wskaźnik na (zainicjowaną) blokadę Działanie: uwalnia jeden z zawieszonych wątków spod blokady (reguły wyboru wątku mogą być zależne od implementacji i skomplikowane, zazwyczaj pisarze mają pierwszeństwo przed czytelnikami); jeśli nie ma żadnych zawieszonych wątków, blokada zostaje otwarta. Uwaga: skutki próby otwarcia otwartej blokady mogą być nieokreślone.
9
int pthread_rwlock_destroy (pthread_rwlock_t *blokada); Zwraca: 0 w przypadku sukcesu dodatni kod w przypadku błędu blokada – wskaźnik na (zainicjowaną) blokadę Działanie: jeśli pod blokadą nie jest zawieszony żaden wątek, zwalnia zasoby związane z daną blokadą (jeśli były one przydzielone dynamicznie), w przeciwnym przypadku zwraca błąd. Uwaga: działanie funkcji nie jest zdefiniowane, jeśli blokada nie była wcześniej zainicjowana.
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.