Tworzenie
i kończenie wątków
|
Funkcje wykorzystane
na
zajęciach. Aby z nich skorzystać należy użyć dyrektywy: int
pthread_create(pthread_t * thread, pthread_attr_t attr, void *
Utworzenie nowego wątku. Nowy wątek rozpocznie wykonywanie się od funkcji, której adres zostanie przekazany jako trzeci argument. Znaczenie parametrów: thread – Adres pod który zostanie zapisany identyfikator nowo utworzonego wątku attr - Atrybuty nowo tworzonego wątku, wartość NULL prowadzi do zastosowania atrybutów domyślnych, dalsze informacje na stronie manuala funkcji pthread_attr_init. start_routine – Adres funkcji, od której rozpocznie się wykonanie nowo utworzonego wątku. Funkcja ta powinna mieć prototyp: void *f(void *arg) Po zakończeniu tej funkcji wątek kończy pracę. Jako arg przekazywany jest czwarty parametr wywołania pthread_create. Wynik tej funkcji zostaje przekazany do pthread_join. arg – Argument przekazany do funkcji rozpoczynającej wątek.
Wynik funkcji pthread_create równy 0 oznacza jej pomyślne wykonanie.
void pthread_exit(void *retval) Zakończenie aktualnego wątku. Jest to alternatywa dla instrukcji return w start_routine. retval - wynik przekazany do pthread_join.
void pthread_join(pthread_t th, void **retadr) Zawiesza bieżący wątek oczekując na zakończenie wątku th. zakończenie wątku Wynik zwrócony przez zakończony wątek zostanie zapamiętany pod adresem retadr.
|
Zadanie 1.
Napisz program w którym zadeklarowano
zmienną globalną Licznik. Funkcja main uruchamia dwa wątki, po czym
czeka na zakonczenie dowolnego z nich. Wątek pierwszy w nieskończonej
pętli wyświetla wartość zmiennej Licznik. Wątek drugi w nieskończonej
pętli inkrementuje tę zmienną. Dodatkowo skompiluj program z opcją
-O3. Opcja ta włącza wszystkie optymalizacje kompilatora. Jak
wytłumaczyć zmianę zachowania programu ? Jak temu zaradzić ? |
Zadanie 2. Napisz program w którym funkcja main tworzy 10 wątków, po czym oczekuje na ich zakończenie. Każdy wątek powinien wykonywać pętlę for, w której wielokrotnie drukowany byłby napis: “Wątek i iteracja k”. Każdy wątek powinien wybierać losowo liczbę iteracji pętli for z przedziału [0-10000]. Po zakończeniu wszystkich wątków funkcja main powinna wyświetlić łączną liczbę iteracji wykonaną przez wszystkie wątki.
|
Opracował: Wojciech Kwedlo |