Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Semafory według normy POSIX Biblioteka funkcji operujących na semaforach POSIX powstała jeszcze przed utworzeniem pakietu pthread, w związku z czym posiada.

Podobne prezentacje


Prezentacja na temat: "Semafory według normy POSIX Biblioteka funkcji operujących na semaforach POSIX powstała jeszcze przed utworzeniem pakietu pthread, w związku z czym posiada."— Zapis prezentacji:

1 Semafory według normy POSIX Biblioteka funkcji operujących na semaforach POSIX powstała jeszcze przed utworzeniem pakietu pthread, w związku z czym posiada następujące cechy: - nazwy funkcji i struktur danych nie posiadają przedrostka pthread_ ; - nazwą włączanego pliku nagłówkowego jest ; - żadna z funkcji w swojej semantyce (swoimi argumentami) nie odwołuje się do pojęcia wątku (choć funkcje te nadają się do synchronizacji wątków – zarówno spokrewnionych, jak i niespokrewnionych); - w przypadku pomyślnego wykonania funkcje zwracają wartość 0, zaś w przypadku błędu zwracają -1 i ustawiają zmienną globalną errno. Semafory POSIX są semaforami wielowartościowymi (wartość maksymalna jest określona stałą SEM_VALUE_MAX i próba przekroczenia jej powoduje błąd), występującymi pojedynczo (nie w tablicach, na których można wykonywać niepodzielne operacje).

2 int sem_init (sem_t *semafor, int czy_dzielony, unsigned int wartość); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na inicjowany semafor czy_dzielony – 0, jeśli dla wątków spokrewnionych, 1, jeśli międzyprocesowy wartość – wartość początkowa semafora Działanie: inicjuje semafor daną wartością. int sem_wait (sem_t *semafor); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na (zainicjowany) semafor

3 Działanie: jeśli semafor ma wartość 0, wstrzymuje wątek, zaś jeśli dodatnią, niepodzielnie zmniejsza ją o 1. int sem_trywait (sem_t *semafor); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na semafor Działanie: takie samo, jak funkcji sem_wait ( ), ale zamiast wstrzymać wątek, sygnalizuje błąd. int sem_post (sem_t *semafor); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu

4 semafor – wskaźnik na semafor Działanie: niepodzielnie zwiększa wartość semafora o 1 (jeśli żaden wątek nie czeka pod nim, a wartość nie jest zbyt duża) lub uwalnia (niedeterministycznie) jeden z zawieszonych wątków. Uwaga: w przeciwieństwie do muteksów semafory nie mają właścicieli (otworzyć semafor może inny wątek, niż go zamknął). int sem_getvalue (sem_t *semafor, int *zmienna); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na semafor Działanie: zapamiętuje aktualną wartość semafora w zmiennej.

5 int sem_destroy (sem_t *semafor); Zwraca: 0 w przypadku sukcesu -1 w przypadku błędu semafor – wskaźnik na semafor Działanie: jeśli pod semaforem nie czeka żaden wątek, likwiduje semafor i zwraca zajmowane przez niego zasoby (jeśli jakiś wątek czeka, funkcja sygnalizuje błąd). Uwaga: jeśli dana implementacja semaforów umożliwia jedynie ich statyczne tworzenie (nie umożliwia dynamicznej rezerwacji i zwalniania), niektóre z powyższych funkcji mogą zwracać zawsze 0.

6 Dane specyficzne wątków Dane specyficzne wątków (Thread Specific Data – TSD) służą do tego, żeby zróżnicować działanie wielu wątków wykonujących jedną, wspólną funkcję. Ze współdzieloną zmienną (kluczem) każdy z wątków może mieć skojarzoną inną wartość. Przykład Jeśli na parkingu kilka osób wypowiada zdanie To jest mój samochód, to dla każdej z tych osób znaczenie tego zdania może być inne (może dotyczyć innego przedmiotu). Maksymalna liczba kluczy dostępnych dla jednego wątku określona jest przez wartość stałej PTHREAD_KEYS_MAX. Zazwyczaj wartości danych specyficznych dla poszczególnych wątków umieszczane są we fragmentach pamięci uprzednio przydzielonych dynamicznie (na przykład przez wywołanie malloc ( ) ) dla tych wątków.

7 int pthread_key_create (pthread_key_t *klucz, void (*destruktor)(void *argument)); Zwraca: 0 w przypadku sukcesu niezerowy kod w przypadku błędu klucz – wskaźnik na klucz destruktor- funkcja sprzątająca skojarzona z danym kluczem, jest wywoływana (w niedeterministycznej kolejności) w chwili kończenia działania (lub unieważnienia) wątku, otrzymuje wskaźnik na argument Działanie: przydziela wątkowi nowy klucz (początkowo skojarzony z wartością NULL w jego TSD) i ustanawia funkcję sprzątającą. Uwaga: wywoływanie destruktora w chwili zakończenia działania wątku może być iterowane w razie potrzeby.

8 int pthread_key_delete (pthread_key_t klucz); Zwraca: 0 w przypadku sukcesu niezerowy kod w przypadku błędu klucz – klucz (uwaga: nie wskaźnik) Działanie: cofa przydział klucza wątkowi (nie sprawdza przy tym, czy wartością skojarzoną z kluczem jest NULL, ani nie wywołuje destruktora). int pthread_setspecific (pthread_key_t klucz, const void *adres); Zwraca: 0 w przypadku sukcesu niezerowy kod w przypadku błędu klucz – klucz adres – adres lokaty w przestrzeni adresowej wątku (zwykle otrzymany przez wcześniejsze wywołanie malloc ( ) przez dany wątek)

9 Działanie: kojarzy z danym kluczem adres, który będzie znany tylko danemu wątkowi (będzie przechowywany w jego TSD). void *pthread_getspecific (pthread_key_t klucz); Zwraca: adres skojarzony z kluczem w przypadku sukcesu NULL w przypadku błędu klucz – klucz Działanie: zwraca adres aktualnie skojarzony z danym kluczem (przez wywołujący wątek).


Pobierz ppt "Semafory według normy POSIX Biblioteka funkcji operujących na semaforach POSIX powstała jeszcze przed utworzeniem pakietu pthread, w związku z czym posiada."

Podobne prezentacje


Reklamy Google