Zaawansowane programowanie w C++ (PCP) - Wyklad 10
Transkrypt
Zaawansowane programowanie w C++ (PCP) - Wyklad 10
Zaawansowane programowanie w C++ (PCP) Wykład 10 - boost Thread. dr inż. Robert Nowak 8 czerwca 2007 dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Równoległość I bardzo wolna reakcja człowieka I wolne urządzenia wejścia - wyjścia (np. drukarki) I bardzo szybkie procesory można przeprowadzać obliczenia podczas obsługi urządzeń Pojęcie równoległości: I na platformach jednoprocesorowych (jednordzeniowych) I na platformach wieloprocesorowych (wielordzeniowych) wieloprocesowe systemy operacyjne dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Aplikacje wielowątkowe Wątek („lekki proces”), pozwala realizować niezależne ciągi instrukcji w ramach procesu. Wątki współdzielą kod i dane (przestrzeń adresową) oraz zasoby. I lepiej wykorzystuje dostępną moc obliczeniową I pozwalają na obsługę wielu zleceń równolegle I mechanizm nie wprowadza dużych narzutów. Stany wątku gotowy wykonywany zatrzymany blokowany dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) wątki (2) Współdzielone są: I zmienne statyczne i globalne I sterta (heap) i zmienne dynamiczne (adres jest unikalny niezależnie od wątku) I obiekty automatyczne (na stosie) jeżeli dostęp jest przez wskaźnik lub referencje I zasoby systemu operacyjnego (pliki, okna itp) I kod wykonywany Niezależne są: I rejestry, ciąg wykonywanych instrukcji, stos I zmienne automatyczne Program ma zawsze jeden wątek (funkcja main() ) - wątek główny lub inicjujący. Może tworzyć dodatkowe wątki. dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Wątki a C++ C++ jest przygotowany do implementacji aplikacji wielowątkowych I większość funkcji z biblioteki standardowej może być bezpiecznie używana w różnych wątkach I należy używać bibliotek przeznaczonych do pracy wielowątkowej (np. obsługa sterty) zabronione funkcje (przechowują stan pomiędzy wołaniami) I I I I rand (<cstdlib>) strtok (<cstring>) asctime, ctime, gmtime, localtime (<ctime>) standard języka nie dostarcza mechanizmów tworzenia i synchronizacji wątków dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) boost::thread - wątki w C++ #include <boost/thread/thread.hpp> //Funkcja główna wątku użytkownika void my_thread() { /* ... */ } //Można też użyć funktora class MyThread { public: //tutaj implementacja funkcji wątku użytkownika void operator()() { /* ... */ } }; int main() { boost::thread thrd(&my_thread); //Utworzenie i uruchomienie wątku thrd.join(); //Biezacy watek czeka na zakonczenie watku thrd } dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Problemy z programowaniem równoległym wyścigi (race conditions): wiele wątków pisze lub czyta tę samą pamięć → niewłaściwa wartość ( niezdefiniowane zachowanie ). watek 1 nr:12 wolne watek 2 znajduje wolne miejsce znajduje wolne miejsce rezerwuje miejsce nr:12 zajęte klient1 rezerwuje miejsce czas nr:12 zajęte klient2 rozwiązanie problemu: synchronizacja (blokady) dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Blokady w boost mutex (mutual-execution) jest używany do szeregowania dostępu do zasobu. Stany: zablokowany, odblokowany. //Utworzenie obiektu służącego do synchronizacji boost::mutex mutex_resource; /* ... */ { //scoped_lock - zdobywanie jest inicjacją, //konstruktor: lock, destruktor: unlock boost::mutex::scoped_lock scoped_lock(mutex_resource); //Tutaj dostęp do zasobu }//Tutaj zwolnienie zasobu boost::mutex boost::try_mutex boost::timed_mutex boost::read_write_mutex boost::try_read_write_mutex boost::timed_read_write_mutex dr inż. Robert Nowak boost::recursive_mutex boost::recursive_try_mutex boost::recursive_timed_mutex Zaawansowane programowanie w C++ (PCP) Problemy przy stosowaniu blokad I zakleszczenia (deadlock) I zagłodzenia (starvation) Watek 1 Watek 2 blokuj A blokuj B blokuj B czeka na zwolnienie B czas dr inż. Robert Nowak blokuj A czeka na zwolnienie A Zaawansowane programowanie w C++ (PCP) problemy z usuwaniem błędów w aplikacjach wielowątkowych I niektóre błędy są niepowtarzalne I różne zachowanie się wersji debug od release I debugger potrzebuje specjalnego wsparcia aby pokazać stany wątków I testy na platformach z jednym procesorem (rdzieniem) mogą nie pokazywać błędów które wystąpią na platformach posiadających wiele procesorów (rdzieni) I trudno testować wszystkie możliwe przebiegi sterowania dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Typowe kończenie wątku nie ma możliwości przerwania wątku z zewnątrz class MyThread { public: MyThread() : finish_(false) {} void finish() { finish_ = true; } void operator()() { while(!finish_) { /* tutaj część przetwarzania */ /* a następnie sprawdzanie warunku !finish_ */ } } private: volatile bool finish_; }; dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP) Podsumowanie I aplikacje wielowątkowe są coraz bardziej powszechne I boost zapewnia obiekty reprezentujące wątki oraz mechanizmy synchronizacyjne I wątki i mechanizm wyjątków dr inż. Robert Nowak Zaawansowane programowanie w C++ (PCP)