Programowanie współbieżne Wykład 6 Iwona Kochaoska
Przekazywanie parametrów Do funkcji obsługi wątku można przekazad dowolną liczbę parametrów
Przekazywanie parametrów Jest to przekazywanie parametrów przez wartośd
Przekazywanie parametrów przez referencję Użycie & to za mało! Kiedy tworzony jest nowy wątek, parametry przekazane do funkcji tego wątku są KOPIOWANE na stos nowego wątku. Adresy kopii parametrów są inne, niż adresy parametrów przekazanych do wątku!
Przekazywanie parametrów przez referencję Metoda ref( )!
Kilka słów o wskaźniku i referencji.. Jak działa wskaźnik?
Kilka słów o wskaźniku i referencji.. Jak działa referencja?
Modyfikator const const w C++ to jeden z najczęstszych modyfikatorów. Historzycznie służył (i służy) do definiowania stałych. const int C = 100; Wskaźniki na stałe Stały wskaźnik Referencja do stałej W programowaniu wielowątkowym const zapewnia bezpieczeostwo!
Modyfikator const wskaźnik na stałą const int C = 100; int* p = &C; // NIE ZADZIAŁA! p jest wskaźnikiem na liczbę, która jest stała., ale typ wskaźnika p nie zawiera takiej informacji! const int C = 100; lub const int C = 100; int const* p = &C; // ZADZIAŁA! const int* p = &C; // ZADZIAŁA! To, na co wskazuje wskaźnik p, nie może byd modyfikowane. Elementem wskazywanym nie musi byd stała: int C = 100; const int* p = &C; // ZADZIAŁA! Można zmieniad elementy na które wskazuje p: const int* p = &x; p = &C; // wskaźnik na zmienną x // wskaźnik na zmienną C
Modyfikator const stały wskaźnik int C = 100; int* const p = &C; Kiedy const pojawia się po gwiazdce, to mamy stały wskaźnik. Czyli możemy modyfikowad element, na który wskazuje p, ale nie możemy zmienid samego p - ten wskaźnik będzie już zawsze wskazywał na ten sam adres w pamięci. Nie możemy: p = &x; //próba zmiany adresu zmiennej, na który wskazuje p Ale możemy: *p = 8; //próba zmiany wartości zmiennej, na którą wskazuje p Staly wskaźnik do stałej: const int* const p = &C; //niczego nie można zmienid!
Referencja do stałej: Referencje do stałych const int& r = INFINITY; lub int const& r = INFINITY; r = 7; // NIE ZADZIAŁA! Czy możemy utworzyd stałą referencję? int x = 7; int& const p = x; NIE! Kompilator może skompilowad taki kod, ale nie jest on zgodny ze sztuką. Referencja z definicji jest stała
Przekazywanie parametrów z modyfikatorem const do podprogramów void f1(int* const a) - stały wskaźnik. Wewnątrz podprogramu f1 można zawoład: *a = 8; // zmiana wartości komórki pamięci, na którą wskazuje a Nie można: a = new int(5);. //zmiana adresu, na który wskazuje a void f2(const int* a) - wskaźnik na stałą. Wewnątrz podprogramu f2 można zawoład: a = new int(5);. Nie można: *a = 8; void f3(const int* const a) - stały wskaźnik na stałą. Nie można: *a = 8; a = new int(5); void f4(const int& a) - stała referencja. Ni e można: a = 8;. Bez modyfikatora const nie można wywoład f4 z parametrem podanym jako wartośd: f4(123);
Jeszcze o przekazywaniu parametrów Do funkcji obsługi wątku przekazywany jest łaocuch znaków: Funkcja obsługi wątku otrzymuje referencję do std::string Jednak łaocuch znaków został przekazany do tej funkcji jako const char*! ( input.dat ). Konwersja na std::string zachodzi tylko w funkcji nowego wątku! To generuje problemy!
Jeszcze o przekazywaniu parametrów Problem Zmienna buffer przekazywana jest do nowego wątku jako bufor znakowy char buffer[15] (lub char* buffer).
Jeszcze o przekazywaniu parametrów Problem c.d. Istnieje pewne prawdpodobieostwo, że funkcja thread_function zakonczy swoje działanie, zanim char* zostanie zmienione lokalnie na std::string! Wskaźnik nie wskazuje na poprawny adres zmiennej i działanie wątku staje się nieprzewidywalne! Rozwiązanie: Bezpośrednie rzutowanie na std::string, zanim parametr zostanie przekazany do wątku: std::thread t1(thread_function, std::string(buffer));
Literatura http://www.acodersjourney.com/2017/08/top-20-cplusplusmultithreading-mistakes/ http://cpp0x.pl/kursy/kurs-c++/poziom-x/wyrazenia-lambda- C++11/423 http://thispointer.com/c11-multithreading-part-2-joining-anddetaching-threads/ http://thispointer.com/c11-multithreading-part-3-carefullypass-arguments-to-threads/