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 |