Wątki i ich synchronizacja

60
Wątki i ich Wątki i ich synchronizacja synchronizacja Jakub Szatkowski Jakub Szatkowski Programowanie w środowisku Windows Programowanie w środowisku Windows 03.12.2010 03.12.2010

description

Wątki i ich synchronizacja. Jakub Szatkowski Programowanie w środowisku Windows 03.12.2010. Plan prezentacji. Pojęcia: proces, wątek Po co nam wątki? Tworzenie wątków. Kontekst wątku, priorytety wątków Problemy dotyczące synchronizacji wątków Metody synchronizacji wątków - PowerPoint PPT Presentation

Transcript of Wątki i ich synchronizacja

  • Wtki i ich synchronizacjaJakub Szatkowski

    Programowanie w rodowisku Windows03.12.2010

  • Plan prezentacjiPojcia: proces, wtekPo co nam wtki? Tworzenie wtkw.Kontekst wtku, priorytety wtkwProblemy dotyczce synchronizacji wtkwMetody synchronizacji wtkwKrtkie omwienie bibliotek

  • Proces Procesem mona nazwa wykonujcy si program. Do wykonania swojej pracy proces potrzebuje na og pewnych zasobw takich jak czas procesora, pami operacyjna czy urzdzenie wejcia-wyjcia. Zasoby te s przydzielane procesowi w chwili jego powstania lub podczas pniejszego dziaania.

  • Proces i wtekW celu wykonania programu system operacyjny przydziela procesowi zasoby ale take moe by konieczne wspbiene wykonywanie pewnych fragmentw programu dziaajcych na tych samych danych. Aby to zrealizowa program moe zada utworzenia okrelonej liczby wtkw wykonujcych wskazane czci programu. Wtki te wspdziel wszystkie zasoby procesu oprcz czasu procesora, ktry jest przydzielany kademu wtkowi osobno.Przykad:WczytajDane(&a1);WczytajDane(&a1);PrzetwrzDane(&a1);PrzetwrzDane(&a1); i WczytajDane(&a2);WypiszDane(a1);WypiszDane(&a1); i PrzetworzDane(&a2);

  • WtekWtek, jest to jednostka wykonawcza w obrbie jednego procesu, bdca kolejnym cigiem instrukcji wykonywanym w obrbie tych samych danych (w tej samej przestrzeni adresowej). Wtek skada si z dwch elementw: obiektu jdra oraz stosu wtku. Obiekt-wtek jest uywany przez system operacyjny do zarzdzania wtkiem. Ponadto, system przechowuje w tym obiekcie informacje o wtku. Na stosie wtku natomiast, trzymane s wszystkie parametry funkcji i zmienne lokalne potrzebne do wykonania kodu wtku. Naley wiedzie, e sam proces w zasadzie niczego nie wykonuje. Jest tylko "pojemnikiem" zawierajcym wtki. Proces musi mie przynajmniej jeden wtek, tzw. wtek gwny, ale moliwe jest utworzenie wikszej liczby wtkw w kontekcie jednego procesu. Co za chwil uczynimy.

  • WtekJednostka dla ktrej system przydziela czas procesoraKady proces ma co najmniej jeden wtekProces nie wykonuje kodu, proces jest obiektem dostarczajcym wtkowi przestrzeni adresowej i odpowiednich zasobwKod zawarty w procesie jest wykonywany przez wtek Pierwszy wtek procesu tworzony jest automatycznie przez system operacyjny, kady nastpny musi by utworzony przez programistWszystkie wtki tego samego procesu dziel przestrze adresow i maj dostp do tych samych zmiennych globalnych i zasobw systemowych.

  • Po co nam wtki?Wiemy, e wieloprogramowo sprawia, e efektywniej wykorzystujemy procesor. Tak samo wtki w danym procesie sprawiaj, e ten proces wykorzystuje efektywniej przydzielony mu czas procesora.Jako przykad posumy si mudnym rekurencyjnym wyliczaniem 3 wartoci wyrazw cigu Fibonacciego i 2 sortowa bbelkowych tablic liczb cakowitych, wszystkie wyniki zapisywane s do plikw i porwnamy czas dziaania programu gdzie mamy 5 wtkw i kady z nich liczy odpowiedni wyraz cigu lub tworzy i sortuje tablic, a nastpnie zapisuje do pliku swj wynik i programu gdzie 1 wtek po kolei wykonuje te same instrukcje.

  • Funkcje tworzca wtekAby stworzy wtek w windows uywamy funkcji:HANDLE CreateThread( PSECURITY_ATTRIBUTES psa, DWORD cbStack,PTHREAD_START_ROUTINE pfnStartAddr,PVOID pvParam, DWORD fdwCreate,PDWORD pdwThreadId );

  • Argumenty funkcji CreateThreadPSECURITY_ATTRIBUTES psaWskanik do struktury SECRUITY_ATTRIBUTES, ktrawyglda tak:typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle; } SECURITY_ATTRIBUTES Kada funkcja tworzca dowolny obiekt jdra pobierawskanik do tej struktury. Parametr nLength okrelarozmiar struktury, parametr lpSecurityDescriptor to adreszainicjalizowanego deskryptora bezpieczestwa. ParametrbInheritHandle decyduje on o tym, czy tworzony obiektjdra jest dziedziczny. My nie bdziemy dziedziczywtkw i bdziemy chcieli ustawi standardowe atrybutybezpieczestwa, dlatego bdziemy przekazywa NULL.

  • Argumenty funkcji CreateThreadDWORD cbStackOkrela ilo przestrzeni adresowej jakwtek moe przeznaczy na swj stos(kady wtek go posiada). Podanie wartoci0 powoduje przydzielenie stosowi wtkucaej pami zarezerwowana dla tego wtku.Dla przypomnienia: DWORD Unsigned Int

  • Argumenty funkcji CreateThreadPTHREAD_START_ROUTINE pfnStartAddrOkrela adres funkcji od ktrej ma si zacz wykonywanie wtku. Przykadowa definicja takiejfunkcji wyglda tak:DWORD WINAPI FunkcjaWatku(PVOID pvParam){cout
  • Argumenty funkcji CreateThreadDWORD fdwCreateOkrela dodatkowe flagi. Podanie 0 powoduje, e wtek jest od razu wprowadzony do kolejki wykonania, podanie w tym miejscu flagi: CREATE_SUSPENDED spowoduje, e wtek po utworzeniu bdzie zawieszony i bdzie oczekiwa na wznowienie go funkcj ResumeThread( HANDLE hThread ) gdzie jako argument podajemy uchwyt do wtku. W kadej chwili moemy wtek zawiesi funkcj SuspendThread(HANDLE hThread);

  • Argumenty funkcji CreateThreadPDWORD pdwThreadIdOstatni parametr funkcji CreateThread musiprzekazywa adres zmiennej typu DWORD,ktra bdzie przechowywa identyfikator(ID) utworzonego wtku.Np. deklarujemy DWORD watek1;i wywoujemy CreateThread(,&watek1);

  • Zakoczenie wtkuIstniej rne sposoby zakoczenia wtku w Windows:VOID ExitThread( DWORD dwExitCode ); ta funkcja zabija wtek, ktry j wywoa, jej parametr okrela kod wyjcia wtku. BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode ); Pozwala zabi dowolny wtek do ktrego podamy uchwyt.Wtek zginie te wtedy gdy zabijemy proces, w przestrzeni ktrego owy wtek dziaa.Gdy funkcja wtkowa zakoczy swoje dziaanie to nie musimy wywoywa adnej funkcji zamykania, watek zakoczy si samoistnie.

  • Tworzenie wtku, co si dzieje?Kiedy wywoujemy funkcj CreateThread() z odpowiednimi parametrami tworzymy nowy obiekt jdra i system inicjalizuje pewne jego wasnoci takie jak: licznik uy, licznik zawiesze, kod wyjcia i stan obiektu. System alokuje pami na stos wtku, ktra pochodzi z przestrzeni adresowej procesu do ktrego naley w wtek. Do stosu zapisywany jest adres funkcji przekazywanej w CreateThread(), a take jej parametr. Kady wtek ma te swj zbir rejestrw CPU zwany kontekstem. Kontekst przedstawia stan obiektu jdra jakim jest wtek. Zbir rejestrw przechowywany jest w strukturze CONTEXT. Przechowywane w niej s m.in. rejestr wskanika instrukcji i rejestr wskanika stosu.

  • Kontekst wtkuTo zbir rejestrw CPU z ktrych wtek korzysta. Kiedy mija czas wykonywania wtku system przerywa jego dziaania i bierze z kolejki kolejny wtek. Aby pierwszy wtek mg dalej kontynuowa swoje dziaanie rejestry CPU musz mie tak sam warto jak w momencie przerwania dziaania. Te wartoci s przechowywane wanie w kontekcie wtku. Nastpuje przeczanie kontekstw wraz z obsug kolejnych wtkw. Struktura CONTEXT pozwala systemowi pamita stan wtku i podj dziaanie od tego momentu, w ktrym ostatnio wtek je zakoczy. Programista jest w stanie w dowolnej chwili odczyta kontekst wtku funkcj GetThreadContext(HANDLE hThread, PCONTEXT pContext);

  • Kontekst wtkuW przykadowej aplikacji wycigamy kontekst wtku i sprawdzamy rejestry CPU Eax, Ebx, Ecx i Edx s to rejestry oglnego przeznaczenia. S to odpowiednio:EAX rejestr akumulacjiEBX rejestr bazowy ECX rejestr licznika EDX rejestr danych Windows daje nam moliwo dowolnegoustawienia rejestrw w kontekcie dziki funkcjiBOOL SetThreadContext(HADLE hThread,CONST CONTEXT *pContext);

  • Zatrzymanie wtku Wtek moemy upi uywajc do tego funkcji: VOID Sleep( DWORD dwMilliseconds); Wtek w ktrym wywoamy t funkcj zostaniezawieszony na czas okrelony przez parametroddajc przy tym swj czas korzystania z CPU.Natomiast funkcja:BOOL SwitchToThread();Sprawia, e jeli istnieje inny wtek oczekujcyjako pierwszy w kolejce na przydzia CPU tosystem przydzieli mu natychmiastowo kwant czasuna wykonanie. Przydatna np. gdy chcemyprzydzieli procesor wtkowi o niszym priorytecie

  • Priorytety wtkuWtki mog mie rne priorytety co ma decydujcy wpyw na to, w ktrej kolejnoci si wykonaj.Kady wtek ma przypisany bazowy poziom priorytetu bdcy liczb z przedziau 0-31 (31najwyszy priorytet, 0-najniszy).Algorytm przydzielajcy CPU wtkom dziaa tak by najpierw obsuy wtki o wyszym priorytecie. System Windows jest systemem z wywaszczeniem, a wic jeli procesor jest przydzielony wtkowi o maym priorytecie, a w kolejce pojawi si wtek o wikszym priorytecie natychmiastowo zatrzymuje dziaanie wtku o niszym priorytecie i daje moliwo wykonania si wtku o wyszym priorytecie.Wtki mog zmienia swoje priorytety

  • Priorytety wtkuPriorytet jest okrelany na podstawie dwch wartoci: klasy priorytetu procesu w ktrym wykonuje si wtek i wzgldnego priorytetu wtku w obrbie procesu.W systemie Windows istnieje 6 klas priorytetw (dotycz procesw!) o nastpujcych waciwociach:Czasu rzeczywistego - (wtki wywaszczaj nawet skadowe systemu)Wysoki np. Eksplorator Windows lub Menader ZadaPowyej normalnegoNormalny standardowa klasa w systemie Windows, jeli tworzymy proces nie okrelajc klasy priorytetu to wanie ta klasa jest mu przydzielanaPoniej normalnegoNiski wtki wykonuj si w momentach bezczynnoci systemu, np. wygaszacz ekranu.

  • Priorytety wtkwKolejn rzecz okrelajc priorytet wtku jest wzgldny priorytet wtku. Windows ma 7 takich rodzajw priorytetw:KrytycznyNajlepszyPowyej normalnegoNormalnyPoniej normalnegoNajgorszyNiskiJeeli chce si ustali priorytet wtku jako liczb od 0 do 31 to naley ustali zarwno klas priorytetu procesu jak i wzgldny priorytet wtku.

  • Priorytety wtkw

  • Klasa priorytetu procesuAby ustawi klas priorytetu procesu mona wywoa proces funkcj CreateProcess() i parametrze fwdCreate ustawi ktr z poniszych flag: REALTIME_PRIORITY_CLASS - czasu rzeczywistego. HIGH_PRIORITY_CLASS - wysoki. ABOVE_NORMAL_PRIORITY_CLASS - powyej normalnego. NORMAL_PRIORITY_CLASS - normalny. BELOW_NORMAL_PRIORITY_CLASS - poniej normalnego. IDLE_PRIORITY_CLASS - niski. Mona rwnie uy funkcji:BOOL SetPriorityClass(HANDLE hProcess,DWORD fdwPriority); Jeli chcemy sprawdzi jak nasz proces ma klas priorytetu moemy uy funkcji:DWORD GetPriorityClass( HANDLE hProcess); Funkcja zwraca jeden z identyfikatorw podanych powyej.

  • Priorytet wzgldny wtkuPriorytet wzgldny ustawiamy wywoujc funkcj:BOOL SetThreadPriority(HANDLE hThread, int nPriority); W parametrze nPriority przekazujemy jeden z poniszych identyfikatorw okrelajcych priorytet: THREAD_PRIORITY_TIME_CRITICAL - krytyczny. THREAD_PRIORITY_HIGHEST - najlepszy. THREAD_PRIORITY_ABOVE_NORMAL - powyej normalnego. THREAD_PRIORITY_NORMAL - normalny. THREAD_PRIORITY_BELOW_NORMAL - poniej normalnego. THREAD_PRIORITY_LOWEST - najgorszy. THREAD_PRIORITY_IDLE - niski. Gdy chcemy pobra wzgldny priorytet wtku naley uy funkcji GetThreadPriority(handle hThread); i przekaza jej odpowiedni uchwyt do wtku.

  • Podwyszanie priorytetwZdarza si, e system sam podwysza priorytet danego wtku. Gdy mamy sytuacj gdy wtek o maym priorytecie nie moe uzyska dostpu do CPU bo wykonuj si wtki o wyszych priorytetach i system tak sytuacj wykryje to podwysza priorytet tego wtku do 15 i pozwala mu si wykona przez dwa kwanty czasu poczym przywraca mu priorytet do wartoci bazowej.Jeli chcemy moemy w swoim programie zablokowa takie dziaania systemu uywajc funkcji: BOOL SetProcessPriorityBoost( HANDLE hProcess, BOOL DisablePriorityBoost); lub wyczy taki mechanizm dla danego wtku: BOOL SetThreadPriorityBoost( HANDLE hThread, BOOL DisablePriorityBoost); Sprawdzenie wczenia to oczywicie: BOOL GetProcessPriorityBoost(HANDLE hProcess, PBOOL pDisablePriorityBoost); lub: BOOL GetThreadPriorityBoost(HANDLE hThread, PBOOL pDisablePriorityBoost);

  • Wtki i priorytety - praktykaUstawimy priorytet procesu jakim jest nasz program na powyej normalnegoUtworzymy dwa wtki, jednego wzgldy priorytet ustawimy na poniej normalnego a drugi na najlepszyPobierzemy od systemu uchwyt do gwnego wtku naszego programu i ustawimy jego wzgldny priorytet na najniszyKady wtek bdzie 50 razy wywietla informacje o swoim numerze i liczniku wywietle

  • Dlaczego synchronizacja?Jak widzielimy w poprzednim programie gdy na chwil zacz dziaa jaki wtek to inny wtek przerywa jego tekst i pisa swj. By tak nie byo potrzebny bdzie jaki mechanizm synchronizacji uywany najczciej przy dostpie wtkw do wspdzielonych danych lub urzdze.Gdyby dwa rne wtki co drukoway na drukarce i nie byyby one zsynchronizowane nie otrzymalibymy satysfakcjonujcego nas wydruku.

  • Dlaczego synchronizacja?Wtki wspzawodnicz o dostp do zasobw. Zasoby te najczciej w danej chwili mog by wykorzystywane tylko przez jeden wtek (lub przez liczb wtkw mniejsz od chtnych). To do czsto spotykana sytuacja w yciu codziennym. Np. poranne korzystanie z azienki. Przecie najpierw czekamy a azienka si zwolni, a potem z niej korzystamy. Gdy jednak dwie osoby naraz chc wej do azienki to albo porwnujemy priorytety swoich potrzeb albo kto musi zastosowa zasad uprzejmoci.

  • Zasb dzielony i sekcja krytycznaW teorii programowania wspbienego (gdzie rne procesy lub wtki korzystaj ze wsplnych zasobw) obiekt, z ktrego moe korzysta wiele procesw lub wtkw w sposb wyczny nazywa si zasobem dzielonym (np. azienka, drukarka), natomiast fragment wtku, w ktrym korzysta on z zasobu dzielonego nazywa si sekcj krytyczn (np. mycie si, drukowanie).W danej chwili z obiektu dzielonego moe korzysta tylko jeden wtek wykonujc sekcj krytyczn uniemoliwia on wykonanie sekcji krytycznych innym wtkom.

  • Wzajemne wykluczanieWzajemne wykluczanie definiuje si tak by zsynchronizowa wtki by kady zajmowa si wasnymi sprawami i wykonywa sekcj krytyczn w taki sposb aby nie pokrywao si to z wykonaniem sekcji krytycznej innych wtkw.Aby to zrealizowa naley do funkcji kadego wtku doda dodatkowe instrukcj poprzedzajce i nastpujce po sekcji krytycznej. Realizujemy czekanie na woln azienk i zasad uprzejmoci.

  • Wymagania czasoweProjektujc wzajemne wykluczanie musimy uwzgldni kilka wanych aspektw:aden wtek nie moe wykonywa swej sekcji krytycznej nieskoczenie dugo, nie moe si w niej zaptli lub zakoczy w wyniku jakiego bdu (jeli kto umrze w azience to bdziemy czeka nieskoczenie dugo jeli nie sprawdzimy co si stao)Wana zasada jest taka by w sekcji krytycznej wtek przebywa jak najkrcej i nie mia moliwoci zakoczenia si bdem.

  • BlokadaW pewnych sytuacjach wtek bdzie wstrzymywany w oczekiwaniu na sygna od innego wtku (gdy azienka si zwolni)Blokada wystpuje wtedy gdy zbir procesw jest wstrzymany w oczekiwaniu na zdarzenie, ktre moe by spowodowane tylko przez jaki inny proces z tego zbioru. Ja jest w azience i czeka a zwolni si komputer a Magosia siedzi przed komputerem w oczekiwaniu na zwolnienie si azienki

  • ZagodzenieJeli sygna synchronizujcy moe by odebrany tylko przez jeden wtek czekajcy to trzeba ktry wybraOznacza to, e wtek o niskim priorytecie moe si zagodzi gdy cigle bd wybierane wtki o wyszym priorytecieW systemie Windows jak ju wiemy omijanie zagodzenia jest realizowane poprzez dynamiczne podwyszanie priorytetw.

  • Problem producenta i konsumentaProblem ten polega na zsynchronizowaniu dwch wtkw: producenta, ktry cyklicznie produkuje jak informacj i przekazuje j do konsumpcji i konsumenta, ktry cyklicznie pobiera t informacj i konsumuje j. Informacje powinny by konsumowane w kolejnoci wyprodukowania.

  • Problem czytelnikw i pisarzyProblem polega na zsynchronizowaniu dwch grup cyklicznych wtkw konkurujcych o dostp do jednej czytelni. Wtek czytelnik co jaki czas odczytuje informacje z czytelni (moe to robi z innymi czytelnikami) natomiast wtek pisarz co jaki czas zapisuje now informacj i wwczas musi przebywa sam w czytelni. Rozwizanie z moliwoci zagodzenia pisarzy (pisarz moe wej gdy czytelnia jest pusta)Rozwizanie z moliwoci zagodzenia czytelnikw (jeli pisarz chce pisa to naley mu to jak najszybciej umoliwi) a wic nowi czytelnicy nie wchodz a pisarz czeka, a czytelnicy siedzcy w czytelni j opuszcz

  • Problem piciu filozofwProblem polega na zsynchronizowaniu dziaa piciu chiskich filozofw, ktrzy siedz przy okrgym stole i myl. Jednak od czasu do czasu kady filozof godnieje i aby mc dalej myle musi si poywi. Przed kadym filozofem stoi miska z ryem, a pomidzy dwoma miskami stoi jedna paeczka. Podnoszc obie paeczki filozof uniemoliwia jedzenie ssiadom. Zakada si, e jeeli filozof podnis paeczki to w skoczonym czasie si naje i odoy je na miejsce. Rozwizanie z moliwoci blokady (godny filozof czeka a bdzie wolna lewa paeczka i j podnosi, a nastpnie czeka, a bdzie wolna prawa paeczka, podnosi j i je, co si stanie gdy kady chwyci lew paeczk? )Rozwizanie z moliwoci zagodzenia (godny filozof czeka a obie paeczki bd wolne, wtedy je podnosi i je, jeden filozof moe siedzie pomidzy takimi, e zawsze ktry z nich bdzie jad)

  • Mechanizmy synchronizacji w WinAPIZdarzeniaMutexySemaforySekcje krytyczneZegary oczekujce

  • ZdarzeniaMoemy sobie zdefiniowa wasne zdarzenie dziki funkcji CreateEvent(). Zdarzenie raz zgoszone istnieje w systemie do momentu odwoania. Kady oczekujcy watek widzi to zdarzenie jako dwustanow flag (zgoszone lub odwoane). Zgaszamy zdarzenie funkcj SetEvent() i wszystkie wtki oczekujce mog wznowi dziaanie. Funkcj ResetEvent() odwoujemy zdarzenie. Czekanie realizujemy za pomoc funkcji WaitForSingleObject(); W CreateEvent podajemy flag rcznego odwoania: TRUE wymaga abymy uyli ResetEvent() natomiast FALSE sprawia, e po przepuszczeniu wtku zdarzenie zostaje automatycznie odwoane. Od tej flagi zaley rwnie dziaanie funkcji PulseEvent(), jeli jest TRUE to funkcja PulseEvent przepuszcza wszystkie wtki oczekujce w danej chwili na zdarzenie, a jeli FALSE to PulseEvent przepuszcza jeden z wtkw oczekujcych po czym odwouje zdarzenie.

  • ZdarzeniaW przykadzie opisujcym zdarzenia utworzymy wtek, ktry bdzie czeka na otwarcie pliku i wtedy wykona swoj operacj.Po utworzeniu pliku wtek gwny bdzie czeka a wtek do czytania wykona swoj operacj.Warto wspomnie, e jeli chcemy zaczeka na kilka zdarze, moemy uy funkcji WaitForMultipleObjects();

  • MutexyMutexy su do realizacji wzajemnego wykluczania si. Stan mutexa jest ustawiany na sygnalizowany (kiedy aden wtek nie sprawuje nad nim kontroli) lub niesygnalizowany (kiedy jaki wtek sprawuje nad nim kontrol). Kady wtek czeka na objcie mutexa w posiadanie za po zakoczeniu operacji wymagajcej wycznoci wtek uwalnia mutexa.

  • MutexyW celu stworzenia mutexa wywoujemy funkcj CreateMutex(). Wtek, ktry stworzy mutexa rzda natychmiastowego prawa do wasnoci mutexa. Inne wtki (lub procesy) otwieraj mutexa za pomoc funkcji OpenMutex(). Potem czekaj na objcie mutexa w posiadanie. Aby uwolni mutexa wywoamy funkcj ReleaseMutex().Jeli wtek zakoczy si i nie uwolni mutexa to taki mutex uwaa si za porzucony. Kady czekajcy wtek moe obj takiego mutexa w posiadanie. Na mutexa czekamy oczywicie funkcj WaitForSingleObject()

  • MutexyW przykadzie pokazujcym dziaanie mutexw pokaemy, jak poszczeglne wtki bd inkrementoway bd dekrementoway zmienn globaln. Sekcj krytyczn bdzie operacja inkrementacji lub dekrementacji i wypisywanie stosownej informacji na ekranie. Ujrzymy przy tym, e w czasie gdy jeden wtek wykonuje swoj sekcj krytyczn to inne wtki sekcji krytycznej objtej tym mutexem nie wykonuj.

  • SemaforySemafory to narzdzie suce do kontroli iloci wtkw korzystajcych z zasobu. Za pomoc semaforu aplikacja moe kontrolowa np. maksymaln ilo otwartych plikw. Semafory s do podobne do mutexw. Nowy semafor tworzony funkcj CreateSemaphore(). Wtek tworzcy semafor ustala warto wstpn i maksymaln licznika. Inne wtki uzyskuj dostp do semafora za pomoc funkcji OpenSemaphore() i czekaj na wejcie za pomoc funkcji WaitForSingleObject(). Po zakoczeniu sekcji krytycznej uwalnia si semafor za pomoc funkcji ReleaseSemaphore(). Wtki nie wchodz w posiadanie semaforu tak jak to byo z mutexem. Jeli wtek, ktry stworzy mutex da do niego dostpu to otrzymuje go natychmiast. Z semaforem jest inaczej tzn. wtek, ktry stworzy semafor czeka w kolejce jak kady inny wtek.

  • Zasada dziaania semaforaInicjalizacja licznika i jego maksymalna wartoKiedy licznik jest wikszy od 0 pierwszy w kolejce wtek moe wej do swojej sekcji krytycznejKiedy wtek wchodzi do swojej sekcji krytycznej zmniejsza o 1 warto licznikaJeli licznik nie jest rwny 0 to inny wtek rwnie moe go podnie i korzysta z sekcji krytycznejKiedy wtek opuszcza sekcj krytyczn i zwalnia semafor, warto licznika zostaje podwyszona o 1. Dziki temu kolejny wtek moe wej do swojej sekcji krytycznej.Gdy z zasobu moe korzysta tylko jeden wtek wtedy tworzymy tzw. semafor binarny, inicjalizujemy licznik na 1, a warto maksymaln ustawiamy na 1.

  • SemaforyW funkcji CreateSemaphore podajemy nastpujce argumenty:LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, wskaznik do atrybutu ochrony (my podajemy NULL)LONG lInitialCount, warto pocztkowa licznika LONG lMaximumCount, maksymalny licznik LPCTSTR lpName, wskanik do nazwy semaforaFunkcja zwraca uchwyt do semaforaGdy wtek koczy dziaanie sekcji krytycznej wywouje funkcj ReleaseSemaphore() podajc w argumentach: uchwyt do semafora, zwolniony licznik i wskanik do poprzedniego licznika, (NULL jeli nie jest to potrzebne).

  • Semafor i rozwizanie problemu piciu filozofwZa pomoc semaforw rozwiemy ten problem korzystajc z rozwizania z moliwoci blokadyPaleczka[i] bdzie reprezentowa semafor paeczki o numerze i. Podniesienie paeczki bdzie to korzystanie z i-tego semafora, a skoczenie jedzenie bdzie to jego zwolnienie.

  • Sekcje krytyczneNarzdzie systemu Windows tylko do obsugi wspbienoci wtkw (w odrnieniu od zdarze, mutexw i semaforw). Umoliwia implementacj sekcji krytycznejNajczciej stosowana metoda w synchronizacji wtkw w Windows

  • Sekcje krytyczneTworzymy zmienn typu CRITICAL_SECTIONW kadej z poniszych funkcji jako argument podajemy adres zmiennej ktr utwoylismyInicjalizujemy sekcj krytyczn: VOID InitializeCriticalSection(); Wejcie do sekcji krytycznej: VOID EnterCriticalSection(); Opuszczenie sekcji krytycznej: VOID LeaveCriticalSection(); Zamknicie sekcji krytycznej: VOID DeleteCriticalSection(); W Windows NT gdy chcemy wej do sekcji krytycznej mamy moliwo uycia funkcji: BOOL TryEnterCriticalSection();

  • Sekcje krytyczne - przykadW przykadowej aplikacji znw posuymy si synchronizacj wywietlania informacji na ekran.Utworzymy 2 sekcje krytyczne by pokaza, e mechanizm CRITICAL_SECTION uatwia tworzenie wielu sekcji krytycznych i atwiej nad nimi panowa bo funkcj wymagaj tylko adresu zmiennej.Pierwsza sekcja krytyczna bdzie suy operacji na globalnej zmiennej a druga bdzie suy wywietlaniu informacji o stanie tej zmiennej.

  • Zegary oczekujceZegary umoliwiaj gwnie regularne wywoywanie wtkw.Zegar oczekujcy przechodzi w stan sygnalizowany po upywie okrelonego czasu lub w okrelonych odstpach czasu z automatycznym powrotem do stanu niesygnalizowanego.Zegar oczekujcy tworzymy funkcj: CreateWaitableTimer(), ktrej argumenty to: wskanik na struktur SA, zmienna BOOL mwica o tym czy zegar ustawiamy rcznie (TRUE) czy automatycznie (FALSE), nazwa zegara. Funkcja zwraca uchwyt do zegara.

  • Zegary oczekujcePo utworzeniu zegar znajduje si w stanie nie aktywnym i nie sygnalizowanymAktywujemy zegar funkcj SetWaitableTimer() z parametrami:Uchwyt do zegaraczas po ktrym zegar przejdzie w czas sygnalizowany (konkretna data i godzina w formacie FILETIME)okres czasu (w milisekundach) po upywie ktrego zegar przechodzi w stan sygnalizowany, zegar automatycznie jest uruchamiany co podany okres, a do wywoania funkcji CancelWaitableTimer()Adres funkcji wywoania zwrotnegoWskanik do przekazywanej strukturyZmienna typu BOOL, ktra gdy ma warto TRUE powoduje, e system budzi si z trybu oszczdzania energii.

  • Zegary oczekujceDostp do zegara wymaga funkcji OpenWaitableTimer() do ktrej podajemy zakres dostpu, przecznik dziedziczenia uchwytu i nazw zegara.

  • POSIX threadpthread jest to najpopularniejsza biblioteka suca do implementacji wtkw wchodzca w skad standardu POSIXUmoliwia implementacj zarwno w systemach UNIX, Linux, a take w Windows. Interfejs jest zaprojektowany obiektowopthread umoliwia:Tworzenie wtkwSynchroniczne koczenie wtkwLokalne dane wtkuObsug mutexwFunkcje oczekujceUstalanie priorytetwOgraniczenia czasowe na zajcie niektrych zdarze

  • POSIX threadTworzenie wtku:int pthread_create( pthread_t *id, const pthread_attr_t *attr, void* (fun*)(void*), void* arg) id - identyfikator wtku; attr - wskanik na atrybuty wtku, okrelajce szczegy dotyczce wtku; mona poda NULL, wwczas zostan uyte domylne wartoci; fun adres funkcji wykonywania wtku; przyjmuje argument typu void* i zwraca warto tego samego typu; arg - przekazywany do funkcji.

  • Boost ThreadZapewnia moliwo programowania wielowtkowego w jednolity sposb na rnych systemachZawiera klasy i funkcje do zarzdzania wtkami i do synchronizacji (m.in. Klasa thread i thread_group)Wnikliwy opis biblioteki na:http://www.boost.org/doc/html/thread.html

  • TThreadC++ Builder w bibliotece VCL umoliwia korzytsanie z klasy TThreadW konstruktorze klasy TThread podajemy flag CREATE_SUSPENDED jako zmienn typu boolC++ Builder ma te gotowe klasy zdarze (TEvent), sekcji krytycznej (TCriticalSection, a take listy wtkw (TThreadList).Jest take specjalna klasa rozwizujca problem czytelnikw i pisarzy (TMultiReadExclusiveWriteSynchronizer), w ktrej mamy metody do rozpoczcia i koczenia czytania i pisania

  • ThreadNa platformie .NET korzysta si z klasy Thread.W C# doczamy using System.Threading;Tworzymy swoj klas i publiczn metod obsugi wtku i podajemy j w argumencie konstruktora klasy Thread jako argument funkcji ThreadStartNp. Thread watek = new Thread(ThreadStart(moja_metoda));

  • Warto zajrzeWtki i synchronizacja w WinAPI:http://win32prog.republika.pl/ebook/watki.pdfhttp://student.eldoras.com/UJ/programowanie_rozproszone_i_rownolegle/prr_w4.pdfhttp://msdn.microsoft.com/en-us/library/ms682453%28VS.85%29.aspxInne biblioteki:http://msdn.microsoft.com/en-us/library/system.threading.thread.aspxhttp://www.boost.org/doc/libs/1_45_0/doc/html/thread.htmlhttps://computing.llnl.gov/tutorials/pthreads/

  • LiteraturaLiteratura dotyczca programowania wspbienego:Silberschatz, Peterson, Galvin Podstawy systemw operacyjnychZbigniew Weiss, Tadeusz Grulewski Programowanie wspbiene i rozproszone

  • KONIECDzikuj za uwag