z powielaniem wielu struktur danych oraz komunikacja

Podobne dokumenty
Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot

Temat zajęć: Tworzenie i obsługa wątków.

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Systemy Operacyjne Ćwiczenia

Watki. kod programu za ladowany do pami eci operacyjnej, wraz ze środowiskiem (zbiorem

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Zaawansowane programowanie w C++ (PCP)

4.2 Sposób korzystania z l acza

4. Procesy pojęcia podstawowe

Programowanie współbieżne Wykład 9 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

przypadków wywo lanie systemowe (funkcja systemowa) lub funkcja biblioteczna zwraca wartość 1(czasamiNULL) iprzypisujezmiennej zewn etrznej,

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

pami eć operacyjna przechowuje dane do przetworzenia, tymczasowe dane pomocnicze,

Grzegorz Mazur. Zak lad Metod Obliczeniowych Chemii UJ. 14 marca 2007

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Plan wykładu. Obliczenia równoległe w zagadnieniach inżynierskich. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

4. Procesy pojęcia podstawowe

Kurs programowania. Wykład 8. Wojciech Macyna

Wielozadaniowość w systemie Microsoft Windows

1.1 Definicja procesu

Systemy Operacyjne - Operacje na plikach

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Obliczenia rozproszone z wykorzystaniem MPI

Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

1. Uruchom poniższy program tworzący pojedynczy wątek:

Proces y i y w i ąt ą ki

Tablice i funkcje. Marcin Makowski. 26 listopada Zak lad Chemii Teoretycznej UJ

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Systemy Operacyjne 1 Laboratorium 2 Procesy i sygnały w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot

System operacyjny MACH

Współbieżność w środowisku Java

Paradygmaty programowania

2.1 Pojęcie wątku Modele wielowątkowości Wybrane zagadnienia wielowątkowości Wątki POSIX... 18

4. Procesy pojęcia podstawowe

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Procesy, wątki i zasoby

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

ezykach wysokiego poziomu (Dijkstra, 1965). semaphore semaphore S; Operacje na semaforze:

Paradygmaty programowania. Paradygmaty programowania

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Functionalization. Jeszcze o funkcjach i strukturze projektu. Marcin Makowski. 3 grudnia Zak lad Chemii Teoretycznej UJ

projektowanie systemu

Implementacje zgodne z tym standardem są nazywane wątkami POSIX lub Pthreads.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wprowadzenie do programowania współbieżnego

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Ghost in the machine

aodczytywać zniegoza pomoc afunkcjiread, (niebuforowane funkcje wejścia/wyjścia). e sukcesem, to zwróci liczb, erzeczywiściezapisanychbajtów.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Wykład 8: klasy cz. 4

5. Model komunikujących się procesów, komunikaty

Programowanie wielowątkowe. Jarosław Kuchta

Wskaźniki, funkcje i tablice

eć dzielona standardu POSIX

Program współbieżny jest zbiorem sekwencyjnych PROGRAMOWANIE C++

Podstawy programowania skrót z wykładów:

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

TEMAT : KLASY DZIEDZICZENIE

Systemy operacyjne III

Zmienne, stałe i operatory

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

SYSTEMY OPERACYJNE WYKLAD 6 - wątki

Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu. Blok kontrolny procesu

Programowanie aplikacji równoległych i rozproszonych. Wykład 1

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Język Java wątki (streszczenie)

Funkcje systemu Unix

Procesy wielowatkowe. Watki. Wspólne dane watków. Prywatne dane watków. Programowanie z użyciem watków

Wykład 3 Składnia języka C# (cz. 2)

Wyk lad 4 Dzia lania na macierzach. Określenie wyznacznika

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Wirtualne sieci prywatne

Rozdzia l 3. Laboratorium 3. danych zawierajac

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Projektowanie oprogramowania systemów PROCESY I ZARZĄDZANIE PROCESAMI

Równoleg le sortowanie przez scalanie

procesy odrębne dzielone

9. Problem wzajemnego wykluczania i sekcji krytycznej

Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

IPC: Kolejki komunikatów

Statystyka w analizie i planowaniu eksperymentu

Systemy operacyjne III

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Systemy operacyjne 2

Wstęp do programowania 2

Paradygmaty programowania. Paradygmaty programowania

Statystyka w analizie i planowaniu eksperymentu

Stan procesu. gotowy - czeka na przydział procesora, zakończony - zakończył działanie.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Transkrypt:

c Wies law P laczek 28 8 Watki 8.1 Wprowadzenie Wiele rozwiazywanych problemów można podzielić na zadania czastkowe, które daja sie wykonać niemal niezależnie. Każde z takich zadań można by powierzyć oddzielnemu procesowi. Jednak tworzenie nowego procesu w systemie jest na ogó l dość kosztowne. Dodatkowe narzuty w takim przypadku wiaza lyby sie z powielaniem wielu struktur danych oraz komunikacja miedzyprocesow a. Bardziej naturalnym rozwiazaniem jest rozwidlenie procesu w jego przestrzeni adresowej i powierzenie poszczególnych zadań tego typu,,podprocesom, zwanym powszechnie watkami (ang. threads). Istnieja pewne klasy zagadnień, które szczególnie nadaja sie do rozwiazań w postaci programów wielowatkowych. Przyk ladami sa tu różnego rodzaju monitory i demony obs lugujace wiele jednoczesnych po l aczeń, programy obs lugujace równocześnie wiele okien, różnorodne zadania typu producent konsument itd. Każdy watek ma swój w lasny stos, zestaw rejestrów, licznik programowy, indywidualne dane, zmienne lokalne, maske sygna lów i informacje o stanie. Wszystkie watki tego samego procesu maja te sama przestrzeń adresowa, ogólna obs luge sygna lów, pamieć wirtualna, dane oraz wejście/wyjście. W ramach procesu wielowatkowego każdy watek wykonuje sie niezależnie i asynchronicznie. Komunikacja miedzy watkami jest u latwiona, ponieważ maja one dostep do wspólnych danych. Istnieja dwa podstawowe poziomy tworzenia watków i zarzadzania nimi: poziom użytkownika oraz poziom jadra. W przypadku watków poziomu użytkownika system operacyjny zawiera podsystem wykonawczy zarzadzaj acy dzia laniem watków. Jadro systemu nic nie wie o watkach, a proces wielowatkowy traktuje tak jak każdy inny proces. Watki zaimplementowane w ten sposób nie wymagaja dużego dodatkowego nak ladu pracy ze strony systemu operacyjnego i latwo daja sie rozbudowywać. W przypadku watków poziomu jadra system operacyjny zapewnia bezpośrednia obs luge watków. Zaleta tego typu modelu jest możliwość efektywnej realizacji wielowatkowości w komputerze wieloprocesorowym. Ponieważ jadro systemu bezpośrednio zarzadza watkami, wiec może je latwo rozdzielać miedzy różne procesory, zwiekszaj ac tym samym wydajność wykonywania procesu. Prze l aczanie watków w tym przypadku jest jednak wolniejsze, gdyż angażuje jadro. W praktyce czesto spotyka sie próby l aczenia zalet obu powyższych rodzajów watków w postaci różnego rodzaju modeli mieszanych. W jednym rodzaju implementacji stosuje sie odwzorowanie typu,,jeden na jeden, w którym system operacyjny przyporzadkowuje jeden watek poziomu użytkownika do jednego watku poziomu jadra (np. systemy Windows NT, OS/2). Innym rozwiazaniem jest relacja typu,,wiele na jeden, gdzie wiele watków poziomu użytkownika jest odwzorowywanych w jeden watek poziomu jadra. Wreszcie sa też modele mieszane typu,,wiele na wiele, w których istnieje wiele watków poziomu użytkownika oraz pewna pula watków poziomu jadra. Watki jadra dzia laja w obrebie tzw. procesów lekkich (ang. light-weight processes, LWP) i sa obs lugiwane przez system operacyjny. Tego typu rozwiazanie zastosowano np. w systemie Solaris firmy Sun Microsystems (jednego z pionierów w dziedzinie wielowatkowości). Istnieje wiele różnych bibliotek funkcji watkowych, czesto zwiazanych z określonymi

c Wies law P laczek 29 systemami operacyjnymi 6. My zajmiemy sie watkami standardu POSIX (zwanymi również P-watkami, ang. Pthreads) i bedziemy korzystać z biblioteki funkcji Thread Library (rozdzia l 3t podrecznika man) zgodnej z ta norma. Zaleta takiego podejścia jest przenośność kodu, jako że wiele wspó lczesnych systemów operacyjnych posiada biblioteki funkcji zgodne ze standardem POSIX. Niemniej jednak niektóre systemy zawieraja specyficzne dla swojego środowiska implementacje watków, które moga być bardziej wydajne od P-watków. Aby móc korzystać z biblioteki funkcji watkowych standardu POSIX należy użyć nastepuj acych dyrektyw: #define _REENTRANT #include Dyrektywa #define REENTRANT musi wystapić przed wszystkimi dyrektywami #include. Oznacza ona dany kod jako kod wielokrotnego użytku (ang. reentrant code), czyli taki, do którego można wiele razy wchodzić (ang. enter). Dodatkowo podczas linkowania (konsolidacji) programu należy użyć opcji -lpthread, powodujacej do l aczenie odpowiedniej biblioteki funkcji watkowych. 8.2 Tworzenie watków Każdy proces zawiera przynajmniej jeden g lówny watek poczatkowy, tworzony przez system operacyjny podczas powo lywania procesu do życia. Aby do procesu dodać nowy watek wykonania, należy użyć funkcji pthread create. Nowy watek bedzie dzia la l razem Pliki w l aczane Prototyp int pthread create(pthread t *pthreadid, const pthread attr t *attr, void * (*start fun) (void *), void *arg); z poprzednio utworzonymi watkami danego procesu (może także, w razie potrzeby, dzia lać razem z innymi watkami innych procesów). Pierwszy parametr funkcji pthread create, o nazwie pthreadid, jest wskaźnikiem na obiekt typu pthread t (w rzeczywistości jest to liczba ca lkowita bez znaku), który w przypadku pomyślnego wywo lania funkcji bedzie niepowtarzalnym identyfikatorem watku (w przypadku argumentu równego NULL identyfikator nie zostanie zwrócony). Drugi parametr, o nazwie attr, wskazuje na dynamicznie rezerwowana strukture atrybutów watku (rozmiar stosu, adres, polityka planowania przydzia lu procesora, stan priorytetu, stan od l aczenia itp.). Aby nadać watkowi domyślne atrybuty systemu wystarczy jako 6 Na przyk lad w systemie Linux w atki można tworzyć przy pomocy funkcji systemowej clone (patrz np. podr ecznik man).

c Wies law P laczek 30 drugi argument tej funkcji przekazać wskaźnik NULL. Do zmiany atrybutów watku s luży funkcja pthread attr init (patrz podrecznik man). Trzeci parametr pthread create jest wskaźnikiem na definiowana przez użytkownika funkcje, która bedzie wykonana jako nowy watek. Funkcja ta powinna mieć jeden parametr w postaci wskaźnika na void i zwracać wskaźnik na void. Jeżeli zwracana przez funkcje wartość jest wskaźnikiem na inny typ niż void, to należy zastosować rzutowanie: (void * (*) ()). Wskaźnik na rzeczywisty argument przekazywany do funkcji definiowanej przez użytkownika jest czwartym parametrem pthread create jest on również wskaźnikiem na void. Aby przekazać kilka argumentów do funkcji użytkownika, należy zdefiniować odpowiednia strukture, zadeklarować ja jako static i zainicjować. Nastepnie w wywo laniu pthread create wskaźnik na te strukture należy zrzutować na wskaźnik na void. Nowo utworzony watek zaczyna sie od wykonania funkcji użytkownika wywo lanej przez funkcje pthread create i dzia la do czasu aż: zakończy sie funkcja (jawnie badź niejawnie), zostanie wywo lana funkcja pthread exit (omawiana poniżej), watek zostanie anulowany za pomoca funkcji pthread cancel (patrz man), zakończy sie proces macierzysty watku (jawnie badź niejawnie), jeden z watków wykona funkcje exec. W przypadku niepowodzenia funkcja pthread create zwraca wartość niezerowa oznaczajac a kod b l edu, np. EAGAIN (11): przekroczony zosta l limit systemowy liczby watków lub procesów LWP; ENOMEM (12): brak pamieci do utworzenia nowego watku; EINVAL (22): nieprawid lowa wartość argumentu attr. 8.3 Kończenie dzia lania watków Do kończenia pracy watku s luży funkcja biblioteczna pthread exit, która dzia la podobnie do standardowej funkcji exit. Ma ona tylko jeden parametr bed acy wskaźnikiem na Pliki w l aczane Prototyp void pthread exit(void *status); wartość Nie wartość stanu watku. Wskaźnik ten jest zwracany, jeśli kończony watek nie jest watkiem od l aczonym (ang. detached). W chwili zakończenia watek zwraca swoje zasoby. Jeżeli funkcja wykonywana w ramach watku zakończy sie (jawnie lub niejawnie), to funkcja pthread exit zostanie automatycznie wywo lana przez system.

c Wies law P laczek 31 8.4 Podstawowe operacje zarzadzania watkami Procesowi, w którym dzia la watek utworzony za pomoca funkcji pthread create można nakazać czekanie na zakończenie tego watku ale tylko takiego, który nie zosta l zadeklarowany jako watek od l aczony (ang. detached). Do tego celu s luży funkcja pthread join. Pliki w l aczane Prototyp int pthread join(pthread t threadid, void **status); Pierwszym jej parametrem jest identyfikator watku, zwracany przez funkcje pthread create. Drugi parametr jest wskaźnikiem na statyczne miejsce w pamieci, w którym zostanie zapisany stan zakończenia watku. Stan ten to argument, który bedzie przekazany funkcji pthread exit lub wartość PTHREAD CANCELED, w przypadku gdy watek zostanie anulowany. Użycie NULL jako drugiego argumentu funkcji pthread join spowoduje zignorowanie informacji o stanie. W przypadku niepowodzenia funkcja pthread join zwraca wartość niezerowa bed ac a odpowiednim kodem b l edu (patrz man pthread join). Watek może być wcielany (ang. join) tylko przez jeden inny watek. Wcielanie jest podobne do czekania (wait) w procesie macierzystym na proces potomny (utworzony przy pomocy funkcji fork). Istotna różnica jest jednak to, że watek można w dowolnej chwili od l aczyć wywo lujac funkcje pthread detach, podczas gdy z procesem potomnym nie da sie tego zrobić. Funkcja biblioteczna pthread detach ma tylko jeden parametr w postaci Pliki w l aczane Prototyp int pthread detach(pthread t threadid); identyfikatora watku. Zakończona pomyślnie spowoduje od l aczenie watku. W przypadku niepowodzenia zwróci odpowiedni kod b l edu (patrz man pthread detach). W momencie zakończenia watku od l aczonego jego zasoby sa automatycznie zwracane systemowi. Natomiast watek nie od l aczony, który nie zostanie wcielony w inny watek, nie zwalnia zasobów po zakończeniu swojego dzia lania. Zasoby te zostana zwolnione dopiero z chwila zakończenia jego procesu macierzystego. 8.5 Synchronizacja watków Ponieważ watki w ramach procesu operuja na wspólnych strukturach danych, dlatego, aby nie dopuścić do niespójności danych, potrzebny jest odpowiedni mechanizm synchronizacji. Watki standardu POSIX można synchronizować na wiele sposobów. Jedna z najprotszych metod jest zastowanie blokad wzajemnie wykluczajacych, tzw. muteksów (ang. mutual exclusion). Muteks jest rodzajem semafora dwustanowego, który watki

c Wies law P laczek 32 moga,,posiadać. Wartość 0 oznacza, że muteks jest otwarty, tzn. zezwala na dostep, a wartość 1, że muteks jest zamkniety, tzn. zabrania dostepu (konwencja odwrotna niż dla semaforów). Muteks może zostać zamkniety przez dowolny watek bed acy w jego zasiegu, natomiast może (i powinien) zostać otwarty tylko przez watek, który go zamkna l. Operacje wykonywane na muteksach sa niepodzielne (atomowe). Muteks może być wewnatrz- procesowy (ang. intra-process) do synchronizowania watków w obrebie jednego procesu, lub miedzyprocesowy (ang. inter-process) do synchronizowania watków różnych procesów. Muteks miedzyprocesowy należy dodatkowo odwzorować w obszar pamieci wspólnej (dzielonej) odpowiednich procesów. Z muteksem zwiazany jest pewien zbiór atrybutów, który może być modyfikowany za pośrednictwem funkcji bibliotecznych: pthread mutex init, pthread mutexattr init lub pthread mutexattr setpshared (szczegó ly można znaleźć na stronach podrecznika man). W dalszej cześci bedziemy zajmować sie tylko muteksami wewnatrzprocesowymi o domyślnych atrybutach. Aby utworzyć taki muteks o nazwie mymutex i zainicjować go jako,,otwarty (tzn. o wartości 0), wystarczy nastepuj aca definicja: pthread mutex t mymutex = PTHREAD MUTEX INITIALIZER; gdzie pthread mutex t jest typem zmiennych muteksowych (w rzeczywistości pewna struktura), a predefiniowana sta la PTHREAD MUTEX INITIALIZER s luży do inicjowania muteksu jako,,otwarty. Powyższa operacje można też zrealizować w inny sposób: pthread mutex t mymutex; pthread mutex init(&mymutex, NULL); Pliki w l aczane Prototyp int pthread mutex init(pthread mutex t *pmutex, const pthread mutexattr t *attr); Funkcja pthread mutex init s luży do inicjowania muteksów. Pierwszy jej parametr jest wskaźnikiem na muteks, a drugi wskaźnikiem na przygotowany wcześniej obiekt atrybutów. Jeżeli jako drugi argument zostanie użyty wskaźnik NULL, to muteks zostanie zainicjowany wartościami domyślnymi dla systemu. W przypadku niepowodzenia, funkcja zwraca kod EINVAL, oznaczajacy podanie niew laściwej wartości któregoś z argumentów. Istnieja cztery funkcje biblioteczne do wykonywania operacji na utworzonych i zainicjowanych muteksach. Każda z nich ma pojedynczy parametr bed acy wskaźnikiem na muteks. Funkcja pthread mutex lock s luży do zamykania muteksu. Wywo lanie jej dla muteksu, który jest już zamkniety spowoduje zablokowanie watku do czasu otwarcia muteksu. Natomiast wywo lanie jej dla muteksu otwartego spowoduje jego zamkniecie i zaw laszczenie przez wywo lujacy watek. Uwaga: Ponowne wywo lanie funkcji zamykajacej przez w laściciela muteksu może doprowadzić do zakleszczenia! Funkcja pthread mutex unlock s luży do otwierania muteksu, ale tylko przez watek, który zamkna l dany muteks wywo lanie

c Wies law P laczek 33 jej przez inny watek może mieć nieprzewidywalne skutki! Funkcja pthread mutex trylock dzia la podobnie jak pthread mutex lock, ale z taka różnica, iż nie powoduje blokowania wywo lujacego ja watku, jeśli dany muteks jest już zamniety (tzn. jest to nieblokujace zamykanie muteksu). Wreszcie funkcja pthread mutex destroy jest przeznaczona do usuwania wskazanego muteksu faktycznie sprawia, że muteks staje sie,,niezainicjowany, użytkownik natomiast musi zadbać o zwolnienie pamieci wskazywanej przez wskaźnik muteksu. Wszystkie te funkcje w przypadku niepowodzenia zwracaja odpowiedni kod b l edu. W szczególności pthread mutex destroy zwraca wartość EBUSY (16), jeżeli wskazywany muteks jest już zamkniety. Pliki w l aczane Prototyp int pthread mutex lock(pthread mutex t *pmutex); Prototyp int pthread mutex unlock(pthread mutex t *pmutex); Prototyp int pthread mutex trylock(pthread mutex t *pmutex); Prototyp int pthread mutex destroy(pthread mutex t *pmutex); Oprócz muteksów istnieje jeszcze kilka innych mechanizmów do synchronizacji watków, w tym semafory. Informacje na ten temat można znaleźć m.in. na stronach podrecznika systemowego man (patrz np. man sem init). ĆWICZENIE 9: Wzajemne wykluczanie dla Watków: Muteksy Przy pomocy muteksów zaimplementować zadanie wzajemnego wykluczania dla watków. Do demonstracji dzia lania programu można użyć sekwencji sterujacych konsoli. Niech na przyk lad watek wykonujac swoja sekcje prywatna wypisuje odpowiedni komunikat po lewej stronie okna konsoli, natomiast bed ac w sekcji krytycznej drukuje informacje po prawej stronie (w tym samym wierszu). Każdy watek może kilka razy powtarzać powyższy cykl. Przy poprawnie zrealizowanym zadaniu wzajemnego wykluczania, po prawej stronie okna konsoli w danym momencie powinien zg laszać sie co najwyżej jeden watek, pozosta le natomiast powinny zg laszać sie po lewej stronie. Do zademonstrowania operacji na zasobie dzielonym użyć np. wspólnej (globalnej) zmiennej licznikowej, zainicjowanej wartościa 0. Niech każdy z watków na poczatku sekcji krytycznej przypisuje jej wartość swojemu prywatnemu licznikowi, nastepnie zwieksza wartość tego prywatnego licznika o 1, a po pewnym czasie (użyć np. funkcji sleep) przypisuje jego wartość wspólnemu licznikowi. Sprawdzić, czy po zakończeniu dzia lania wszystkich watków wartość tego wspólnego licznika jest taka jaka powinna być.