Tworzenie i kończenie wątków



Funkcje wykorzystane na zajęciach. Aby z nich skorzystać należy użyć dyrektywy:
#include <pthreads.h>

int pthread_create(pthread_t * thread, pthread_attr_t attr, void *
(*start_routine)(void *), void *arg)


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_routineAdres 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