C++ 0x aka C++11. Základním kamenem je třída std::thread

Podobné dokumenty
Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Paralelní a distribuované výpočty (B4B36PDV)

Vlákna. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Aleš Hrabalík a Martin Hořeňovský, 2016

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

PROGRAMOVÁNÍ V C++ CVIČENÍ

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

IUJCE 07/08 Přednáška č. 1

Zpracoval:

PB161 Programování v jazyce C++ Přednáška 4

Funkční objekty v C++.

Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.

PB161 Programování v jazyce C++ Přednáška 10

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Programování v C++ 2, 4. cvičení

PB161 Programování v jazyce C++ Přednáška 10

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Více o konstruktorech a destruktorech

Množina čísel int stl-set-int.cpp

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

PB161 Programování v jazyce C++ Přednáška 8

PB161 Programování v jazyce C++ Přednáška 9

Procesy a vlákna - synchronizace

8 Třídy, objekty, metody, předávání argumentů metod

Jazyk C++ II. Výjimky

Jazyk C++ I. Šablony 2

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Řada programovacích jazyků nabízí prostředky pro řešení meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce.

Mělká a hluboká kopie

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dynamická identifikace typů v C++.

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Základní datové struktury

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Vlákna. První jednoduchý program s vlákny:

Principy operačních systémů. Lekce 6: Synchronizace procesů

Vstupní a vstupní proudy v C++

30. Vlákna, jejich atributy, metody, organizace a stavy. Možnosti synchronizace. (A7B36PVJ)

Principy počítačů a operačních systémů

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Pavel Procházka. 3. prosince 2014

Programování v jazyce C a C++

přetížení operátorů (o)

Jazyk C# (seminář 6)

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Domácí úkoly 2013/14

Vlákna. První jednoduchý program s vlákny:

Operační systémy. Přednáška 5: Komunikace mezi procesy

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Programování v C++ 1, 5. cvičení

Programování v C++ 1, 17. cvičení

Programování v Javě I. Leden 2008

Vector datový kontejner v C++.

Procesy a vlákna IPC Komunikace mezi procesy (IPC = Inter-Process Communication)

Zpracoval:

PB přednáška (23. listopadu 2015)

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

Paralelní programování

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Paralelní programování

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Programování v Javě I. Únor 2009

Operační systémy. Cvičení 4: Programování v C pod Unixem

Operační systémy. Cvičení 3: Programování v C pod Unixem

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Struktury, funkce, reference

Zápis programu v jazyce C#

map, multimap - Asociativní pole v C++.

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Objektově orientované programování

Operační systémy. Přednáška 4: Komunikace mezi procesy

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Vláknové programování část VI

Základy programování (IZP)

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

C++ objektově orientovaná nadstavba programovacího jazyka C

Množina v C++ (set, multiset).

přetížení operátorů (o)

Paralelní programování

Standardní algoritmy v C++.

Paralelní a distribuované výpočty (B4B36PDV)

C++ objektově orientovaná nadstavba programovacího jazyka C

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Transkript:

C++ 0x aka C++11 Jako jiné jazyky, např. Free/Object Pascal, se C++ ve standardu ++0x dočkal podpory vláken Výhodou je, že standardní knihovna je platformě nezávislá na úrovni zdrojového kódu Základním kamenem je třída std::thread #include <thread> #include <iostream> void my_thread_func() { std::cout<<"hello"<<std::endl; void write_sum(int x,int y){ std::cout<<x<<" + "<<y<<" = " <<(x+y)<<std::endl; std::thread t1(my_thread_func); std::thread t2(write_sum,123,456); t1.join(); t2.join(); Třída bere funkci, i např. přetížený operátor () objektu, jako první argument o A pak následují další argumenty o Argumenty se kopírují do interního úložiště threadu Strana 1 (celkem 9)

Je-li cílem spustit jinou funkci než funkční operátor () o předá se pointer na funkci o pointer, který se použije jako hodnota this o a případné argumenty #include <thread> #include <iostream> class CSayHello { public: void greeting(std::string const& message) const { std::cout<<message<<std::endl; ; CSayHello x; std::thread t(&csayhello::greeting,&x,"goodbye"); t.join(); o pochopitelně se musí zajistit, že objekt přežije vlákno, např. lze takto: std::shared_ptr<csayhello> p(new CSayHello); std::thread t(&csayhello::greeting,p,"goodbye"); t.join(); Strana 2 (celkem 9)

Je-li cílem předat referenci na existující objekt o Tj. chceme-li zavolat () operátor přímo na konkrétním objektu, ne na jeho kopii o A chceme-li čitelný kód #include <thread> #include <iostream> #include <functional> class CPrintThis { public: void operator()() const { std::cout<<"this="<<this<<std::endl; ; CPrintThis x; x(); std::thread t(std::ref(x)); t.join(); o std::ref se dá použít i pro argumenty Strana 3 (celkem 9)

Synchronizace o std:mutex má lock, try_lock a unlock není rekurzivní o std::recursive_mutex o timed_mutex a recursive_timed_mutex umožňují u trylock specifikovat dobu čekání try_lock_for a try_lock_until o důležitá je šablona std::lock_guard zajistí, že daný blok kódu bude hlídán mutexem a že bude kritická sekce opuštěna vždy, když vykonávaný kód opustí daný blok kódu a to včetně zpracování vyjímek => nemusí se tedy na konec try a do catch dávat unlock std::mutex m; unsigned counter=0; unsigned increment() { std::lock_guard<std::mutex> lk(m); return ++counter; unsigned query(){ std::lock_guard<std::mutex> lk(m); return counter; Strana 4 (celkem 9)

Šablona std::unique_lock o Umožňuje vytvořit zámek, který se zamkne, až mu řekneme #include <mutex> #include <thread> #include <chrono> struct Box { explicit Box(int num) : num_things{num { ; int num_things; std::mutex m; void transfer(box &from, Box &to, int num){ // don't actually take the locks yet std::unique_lock<std::mutex> lock1(from.m, std::defer_lock); std::unique_lock<std::mutex> lock2(to.m, std::defer_lock); // lock both unique_locks without deadlock std::lock(lock1, lock2); from.num_things -= num; to.num_things += num; lock1.unlock(); lock2.unlock(); Box acc1(100); Box acc2(50); std::thread t1(transfer, std::ref(acc1), std::ref(acc2), 10); std::thread t2(transfer, std::ref(acc2), std::ref(acc1), 5); t1.join(); t2.join(); Strana 5 (celkem 9)

Podmínkové proměnné o Condition_variable o notify/all a wait/for/until o wait bere jako parametr zámek zámek musí být zamčený v době volání wait std::condition_variable cv; std::mutex cv_m; int i = 0; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cerr << "Waiting... \n"; cv.wait(lk, [](){return i == 1;); std::cerr << "...finished waiting. i == 1\n"; void signals() { std::this_thread::sleep_for(std::chrono::seconds(1)); std::cerr << "Notifying...\n"; cv.notify_all(); std::this_thread::sleep_for(std::chrono::seconds(1)); i = 1; std::cerr << "Notifying again...\n"; cv.notify_all(); Atomické operace a inicializace o call_once zavolá funkci jenom jednou, i kdyby byla volána z více vláken o viz šablony std::atomic* Vyhnutí se deadlocku o std::lock viz příklad výše, viz priority vidliček večeřících filozofů Strana 6 (celkem 9)

Asynchronní volání o std::async vykoná kód funkce nezávisle na vláknu, ze kterého byla std::async zavolána nezaručuje, že se vykoná v jiném vláknu o std::future vrací hodnotu std::async výpočtu #include <future> #include <iostream> int calculate_the_answer_to_ltuae(); void do_stuff(); int main() { std::future<int> the_answer=std::async(calculate_the_answer_to_ltuae); do_stuff(); std::cout<<"the answer to life, the universe and everything is " <<the_answer.get()<<std::endl; Strana 7 (celkem 9)

Komplikovaněji, ale zato s větší kontrolou nad vlákny, je možnost použití std::promise o Např. pro I/O operace o Promise je svázán s future Jeden thread pomocí set_value zapíše výsledek A druhý thread si ho pak vyzvedne Promise je v podstatě úložiště hodnoty, dokud si ji někdo nevyzvedne přes svázanou future Producent vloží hodnotu do promise Konzument si vyzvedne hodnotu z future typedef int (*calculate)(void); void func2promise(calculate f, promise<int> &p) { p.set_value(f()); int main(int argc, char *argv[]) { getuserdata(); promise<int> p1, p2; future<int> f1 = p1.get_future(), f2 = p2.get_future(); thread t1(&func2promise, calculateb, std::ref(p1)), t2(&func2promise, calculatec, std::ref(p2)); c = (calculatea() + f1.get()) * f2.get(); t1.join(); t2.join(); showresult(); Strana 8 (celkem 9)

Další čtení a příklady převzaty z: o http://en.cppreference.com/w/cpp/thread o http://en.cppreference.com/w/cpp/atomic o http://www.justsoftwaresolutions.co.uk/threading/m ultithreading-in-c++0x-part-1-starting-threads.html o http://msdn.microsoft.com/enus/magazine/hh852594.aspx Strana 9 (celkem 9)