Wątki

Transkrypt

Wątki
Programowanie w systemie Linux. rc4 .03.10 Jacek Lach
Wątki
#include <pthread.h>
gcc ... -lpthread
Tworzenie wątków
int pthread_create(pthread_t *thread, pthread_attr_t *attr,
void * (*thread_routine)(void *), void *arg) - tworzy nowy wątek
int pthread_attr_init(phread_attr_t *attr) - inicjalizacja atrybutów
int pthread_attr_set*() - ustawianie atrybutów wątku
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
int pthread_attr_destroy(pthread_attr_t *attr) - zwolnienie atrybutu
pthread_t tt;
pthread_attr_t tattr;
pthread_attr_init(&tattr);
pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
pthread_create(&tt, &tattr, tfun, NULL);
pthread_attr_destroy(&tattr);
Zakończenie pracy wątku:
• powrót z funkcji wątku
• wątek wykonuje pthread_exit(void *retval)
• na wątku zostaje wykonana funkcja pthread_cancel(pthread_t thread)
Usunięcie wątku przy pomocy pthread_cancel() może odbyć się na 3 sposoby:
• synchronicznie - żądania usunięcia są kolejkowane, wątek jest usuwany po
osiągnięciu punktów w których usunięcie będzie możliwe
• asynchronicznie - wątek jest zatrzymywany w dowolnym momencie wykonania
• wątek może zablokować możliwość jego usunięcia
Ustawienie reakcji wątku na usuwanie:
pthread_setcancelstate(int state, int *oldstate) włącza(PTHREAD_CANCEL_ENABLE) / wyłącza
(PTHREAD_CANCEL_DISABLE) możliwość usuwania wątku
pthread_setcanceltype(int type, int *oldtype) - ustawia tryb usuwania wątku na
asynchroniczny (PTHREAD_CANCEL_ASYNCHRONOUS) / synchroniczny
(PTHREAD_CANCEL_DEFERRED)
Punkty, w których jest możliwe usunięcie wątku to miejsca wykonania funkcji:
pthread_join(), pthread_cond_wait(), pthread_condtimed_wait(), pthread_testcancel(),
sem_wait(), sigwait()
int pthread_join(pthread_t thread, void **thread_return)- oczekiwanie na zakończenie
wskazanego wątku
Synchronizacja
Mutex'y
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
- utworzenie obiektu umożliwiającego wzajemne wykluczanie (mutex'a)
int pthread_mutex_lock(pthread_mutex_t *mutex) - zajęcie mutex'a (lub blokada gdy ten
już zajęty)
int pthread_mutex_trylock(pthread_mutex_t *mutex) - próba zajęcia mutex'a (nie
blokuje wątku gdy mutex jest już zajęty)
int pthread_mutex_unlock(pthread_mutex_t *mutex) - zwolnienie mutex'a
int pthread_mutex_destroy(pthread_mutex_t *mutex) - zwolnienie zasobów związanych
z mutex'em
Semafory
int sem_init(sem_t *sem, int pshared, unsigned int value) - inicjalizuje semafor
int sem_wait(sem_t *sem) - blokuje wątek do momentu gdy wartość semafora > 0
int sem_trywait(sem_t *sem) - jw. ale jeżeli wartość semafora <=0 zwraca błąd
int sem_post(sem_t *sem) - zwiększa wartość semafora
int sem_getvalue(sem_t *sem, int *sval) - odczytuje zawartość semafora
int sem_destroy(sem_t *sem) - zwalnia zasoby skojarzone z semaforem
Warunki
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *condattr) inicjalizacja warunku
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) - zwalnia mutex
i blokuje wątek do momentu otrzymania sygnału wygenerowanego przez
pthread_cond_signal() lub pthread_cond_broadcast(). Mutex powinien zostać zajęty
przed wywołaniem pthread_cond_wait() (pozostanie zajety po powrocie z tej
funkcji)
int pthread_cond_timedwait( pthread_cond_t *cond, pthread_mutex_t *mutex, const
struct timespec *abstime) - jw. blokada wątku ograniczona czasowo
int pthread_cond_signal(pthread_cond_t *cond) - uruchamia jeden z wątków
oczekujących na warunek
int pthread_cond_broadcast(pthread_cond_t *cond) - uruchamia wszystkie wątki
oczekujące na warunek