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