Laboratorium 6
==============
Watki (LinuxThreads) 
-----------------
Lektura podstawowa:
      * man do poszczegolnych funkcji z pthread.h  
      * http://rainbow.mimuw.edu.pl/SO/LabLinux/PROCESY/PODTEMAT_4/watki.html

1. Kompilacja: wywolaj program `make'
2. Uzytkowanie: uruchamianie programow
3. Pliki:

   threads.c
        Program ilustruje sposob tworzenia oraz konczenia watkow oraz 
	wspoldzielenie przez nie obszaru danych.  Wywolanie programu bez 
	parametru umozliwia synchronizacje przez oczekiwanie na zakonczenie 
	wszystkich watkow.  Wywolanie programu z dowolnym parametrem wylacza 
	mozliwosc "laczenia sie" watkow. 
        Wazne funkcje:   pthread_create, pthread_join, pthread_exit, 
                         pthread_attr_init, pthread_attr_destroy oraz 
	                 inne funkcje obslugujace atrybuty watkow. 

   prod_kon.c
	Dwuwatkowy producent-konsument.  Producent wstawia do bufora 10000 
	porcji, a konsument je pobiera i wypisuje na standardowe wyjscie. 
        Program ilustruje sposob uzycia mechanizmu mutexow i warunkow do 
	synchronizacji watkow. 
        Wazne funkcje:  pthread_mutex_init, pthread_mutex_lock, 
		        pthread_mutex_unlock, pthred_mutex_destroy,
		        pthread_cond_init, pthread_cond_wait, 
		        pthread_cond_signal, pthread_cond_broadcast.

   cancel.c
        Program ilustruje sposob konczenia watkow za pomoca pthread_cancel
	oraz mechanizm "cancellation points". Zwroccie uwage na pare 
	pthread_cleanup_push oraz pthread_cleanup_pop otaczajacych wywolanie
	pthread_testcancel (cancellation point!) wewnatrz mutexa. Bez nich 
	dochodzi do bledu! Rowniez ustawienie asynchronicznego trybu reakcji na
	pthread_cancel prowadzi do bledu (jesli asynchroniczny cancel pojawi
	sie miedzy mutex_lock a cleanup_push). Zachecam do eksperymentow. 
        Wazne funkcje: pthread_cancel, pthread_cleanup_push, 
                       pthread_cleanup_pop, pthread_setcanceltype,
	               pthread_clenaup_setcancelstate.
  
  timeout.c
	Program ilustruje, w jaki sposob mozna oczekiwac na zajscie pewnych 
	warunkow z okreslonym limitem czasu.
	Wazne funkcje: pthread_timedwait, gettimeofday.

4. Uwagi:
  a) Oprocz LinuxThreads istnieja inne biblioteki obslugujace watki,
     np.: PCThreads. Sa bardzo istotne roznice w semantyce poszczegolnych 
     funkcji pomiedzy roznymi bibliotekami. Pojawiaja sie one wszedzie:
     domyslne wartosci opcji, rozne lub te same PIDy watkow tworzonych 
     przez jeden proces, sposob obslugi cancellation point. 
  b) Programy nalezy kompilowac z opcjami -D_REENTRANT -lpthread
  c) Uwaga na funkcje cancel! Nie wszystkie funkcje, ktore zgodnie z manem 
     powinny zachowywac sie jak "cancellation points" faktycznie sa nimi
     (np. pthread_cond_wait). Uwaga ta dotyczy biblioteki dostepnej na 
     wydziale.  
  d) LinuxThreads ustawia zmienna errno, ale moga wystapic problemy z
     niektorymi wersjami libc. Poniewaz w implementacji watkow korzysta sie
     z sygnalow, czesto zmienna errno jest ustawiona na EINTR, zamiast
     spodziewanej wartosci.
  e) Makefile zostal napisany "po nowemu".  Zwroc uwage, ze kazda nazwa pliku
     wystepuje w Makefile tylko raz.  Mniejsze sa wiec mozliwosci popelnienia
     bledu.
