Real-Time Systems (RTSYST)

Vergelijkbare documenten
Real-Time Software (RTSOF) EVMINX9 Week 2

Inhoud RTSYST. Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7

Technology, Innovation & Society Delft

Real-Time Systems (RTSYST)

Real-Time Systems (RTSYST)

Datastructuren Werkcollege Intro

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Datastructuren: stapels, rijen en binaire bomen

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

C++ programmeermethoden Bachelor Kunstmatige Intelligentie

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

Datastructuren: stapels, rijen en binaire bomen

Introductie in C++ Jan van Rijn. September 2013

Objectgeoriënteerd Programmeren in C++

Algoritmen en Datastructuren

Kleine cursus PHP5. Auteur: Raymond Moesker

Inleiding Een terugblik op C... 3

C++ programmeermethoden Bachelor Kunstmatige Intelligentie

Academie voor ICT en Media 2013/2014

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Tentamen Imperatief Programmeren

Vakgroep CW KAHO Sint-Lieven

Objectgeoriënteerd Programmeren in C++

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Programmeermethoden. Controle-structuren. Walter Kosters. week 3: september kosterswa/pm/

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Inleiding C++ Coding Conventions

C++ C++ als een verbetering van C. Abstracte datatypen met classes. Constructoren en destructoren. Subklassen. binding van functies

Modelleren en Programmeren

Concurrency in Java met threads. Java Threads. Voorbeelden concurrency in applicaties. Waarom concurrency in Java?

Lessen Java: Reeks 3. David Blinder Jan G. Cornelis

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Programmeertechnieken Week 6

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Programmeren in Java 3

Centrale begrippen hoofdstuk 3. Waarom multiprogramming? Vandaag. processen proces state: running, ready, blocked,... Vragen??

Inhoud. Les 13 Les 16 Les 19 Les 2 Les 5 Les 8 Les 11 Les 14 Les 17 Les 20 Les 3. Les 1. Les 7. Les 4. Les 10. Les 12 Les 15. Les 6.

/20. richtlijnen. Lees deze richtlijnen! Log in op de pc met. login: paswoord: examen i examen001. Log in op. x.toledo.ucll.be

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Online c++ leren programmeren:

int getaantalpassagiers{): void setaantalpassagiers(int aantalpassagiers);

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Zelftest Programmeren in Java

IMP Uitwerking week 13

Real-Time Software (RTSOF) EVMINX9 Week 1

DOMjudge teamhandleiding

datastructuren college 13

college 2: Introductie

Methodology. Fictie of werkelijkheid?

Verslag Opdracht 4: Magische Vierkanten

Multi-core systemen. door Alexander Melchior

Werkvormen 84 SBU. Inhoud. !OOP = Object Oriënted Programming N C++ (niet volledig)

ICT Infrastructuren: Concurrency en Deadlock. 25 november 2013 David N. Jansen

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest.

Gelijktijdigheid: Wederzijdse Uitsluiting & Synchronisatie Concurrency: Mutual Exclusion & Synchonization (5e ed: , Appendix A.

vandaag èn vrijdag deadline maandag 12 dec.

Programmeren in C++ (deel 1)

Gevorderd Programmeren

Modelleren en Programmeren

Scala. Korte introductie. Sylvia Stuurman

Modelleren en Programmeren

Gertjan Laan Aan de slag met C++ Vijfde editie

Modelleren & Programmeren. Jeroen Fokker

EmSE presentatie. Starten met de ATtiny2313: Een RGB powerled driver Kees Moerman, 13 juli 2010

TECHNISCHE UNIVERSITEIT EINDHOVEN Faculteit Wiskunde en Informatica

ASP.NET Test Jan Van Ryckeghem

Veel succes! 1. Gegeven is de volgende klasse:

9 Meer over datatypen

Real-Time Systems (RTSYST)

Algoritmen en Datastructuren

Deel 1 : Gesloten Boek

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Vraag 1: Software Levenscyclus

C``ifPCwhileLinuxdiffintFirefoxboolpublicprivateWindows. fileg``unixvisualosfedoralscharpsopenclosegetputarray

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Klassen. Hoofdstuk Klassen

Semaforen. Semaforen p. 1/2

Tentamen Computersystemen

Overerving & Polymorfisme

Computerarchitectuur en netwerken Toets 1 4 okt

Dit document bevat informatie over make bij het eerstejaars college Programmeermethoden, Universiteit Leiden, najaar 2010, zie

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Modulewijzer Tirdat01

Wat wel en niet kan. opnieuw geschreven. Dit heeft onder andere geleid tot de toevoeging van het java.

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

Examen Software Ontwikkeling I 2e Bachelor Informatica Academiejaar Januari, **BELANGRIJK** : Schrijf je naam onderaan dit blad

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Syntax van opdracht. opdracht. expressie. variabele. = expressie ; klasse naam. methode naam. property naam += object

Ingebouwde klassen & methodes

van C++ studiematriaal " diverse Java tutorials op WWW " Thinking in Java.

Transcriptie:

Real-Time Systems (RTSYST) Week 3 C++ concurrent programmeren C++ heeft sinds C++11 een standaard library voor concurrent programmeren. Alternatieve libraries: Boost Thread library http://www.boost.org/ Intel Threading Building Blocks (TBB) http://www.threadingbuildingblocks.org/ Microsoft Parallel Pattern Library (PPL) http://msdn.microsoft.com/en-us/library/dd492418.aspx Open Multi-Processing(OpenMP) http://openmp.org Er zijn ook uitbreidingen van C++ die concurrency aan de taal toevoegen (met taalconstructies). μc++ voegt o.a. taalconstructies task en monitor toe. http://plg.uwaterloo.ca/~usystem/uc++.html Real-Time? Beschikbaar in MS VC++ 2012 en in GCC 4.7 60 Harry Broeders 1

C++11 concurrency Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics C++11 Thread voorbeeld 1 (1) #include <thread> #include <iostream> using namespace std; void print1() { for (int i = 0; i < 10; ++i) { this_thread::sleep_for(chrono::milliseconds(10)); cout << "print1" << endl; void print2() { for (int i = 0; i < 10; ++i) { this_thread::sleep_for(chrono::milliseconds(20)); cout << "print2" << endl; 62 Harry Broeders 2

C++11 Thread voorbeeld 1 (2) int main() { thread t1(&print1); thread t2(&print2); t1.join(); t2.join(); return 0; 63 C++11 Thread voorbeeld 2 #include <thread> //... void print(int delay, const string& msg) { for (int i = 0; i < 10; ++i) { this_thread::sleep_for( chrono::milliseconds(delay)); cout << msg << endl; int main() { thread t1(&print, 10, "print1"); thread t2(&print, 20, "print2"); t1.join(); t2.join(); return 0; Wel type-safe (in tegenstelling tot pthreads). print1 print2 print1 print1 print2 print1 print1 print2 print1 print1 print2 print1 print1 print2 print1 print2 print2 print2 print2 print2 64 Harry Broeders 3

C++11 Thread thread::hardware_concurrency() Geeft het aantal hardware threads wat op het huidige systeem beschikbaar is (= aantal CPU s of cores of hyperthreading units), of 0 als deze informatie niet beschikbaar is. t.native_handle() Geeft een instantie van native_handle_type wat gebruikt kan worden met de platform-specific API om de onderliggende implementatie te programmeren. Kan in een real-time pthread omgeving gebruikt worden om de prioriteit in te stellen. C++11 std: The presence of native_handle() and its semantics is implementation-defined. Actual use of this member is inherently non-portable. 65 C++11 Synchronization Mutexen mutex void lock(); bool try_lock(); void unlock(); recursive_mutex Idem maar telt aantal locks (en aantal unlocks). Locks Conditionele variabelen 66 Harry Broeders 4

C++11 Mutex voorbeeld class Point { public: Point(): x(0), y(0) { void stepnortheast() { ++x; ++y; bool isnortheast() const { return x == y; private: int x, y; ; y x==y Wat gebeurt er als deze class in een multi-threaded omgeving gebruikt wordt? x 67 C++11 Mutex voorbeeld class TestPoint { private: Point p; void thread1() { for (int i = 0; i < 20000000; ++i) p.stepnortheast(); void thread2() { for (int i = 0; i < 20000000; ++i) Probleem! Probleem! Einde. if (!p.isnortheast()) cout << "Probleem!" << endl; public: void test() { thread t1(&testpoint::thread1, this); thread t2(&testpoint::thread2, this); t1.join(); t2.join(); cout << "Einde." << endl; 68 ; Harry Broeders 5

C++11 Mutex voorbeeld class Point { public: Point(): x(0), y(0) { void stepnortheast() { m.lock(); ++x; ++y; m.unlock(); bool isnortheast() const { m.lock(); bool res = x == y; m.unlock(); return res; private: mutable mutex m; int x, y; ; Zonder mutex Met mutex Einde. Run-time 0.265 s 103.482 s Kan aangepast worden in const memberfunctie 69 C++11 Mutex voorbeeld class Point { public: Point(): x(0), y(0) { void stepnortheast() { m.lock(); ++x; ++y; m.unlock(); bool isnortheast() const { m.lock(); bool res = x == y; m.unlock(); return res; bool iswithinlimits() const { m.lock(); bool res = x >= 0 && x <= 1000000 && y >= 0 && y <= 1000000; m.unlock(); return res; private: Je wilt niet onnodig wachten! mutable mutex m; int x, y; 70 ; Harry Broeders 6

boost::shared_mutex class Point { public: Point(): x(0), y(0) { void stepnortheast() { m.lock(); ++x; ++y; m.unlock(); bool isnortheast() const { m.lock_shared(); bool res = x == y; m.unlock_shared(); return res; bool iswithinlimits() const { m.lock_shared(); bool res = x >= 0 && x <= 1000000 && && y >= 0 && y <= 1000000; m.unlock_shared(); return res; private: mutable boost::shared_mutex m; int x, y; ; isnortheast() en iswithinlimits() kunnen nu parallel draaien! 71 C++11 Mutex C++11 kent geen shared_mutex Je kunt zelf met behulp van conditionele variabelen en mutexen een multiple readers / single-writer mutex maken. Huiswerk: Implementeer zelf eenshared_mutex class met de in C++11 beschikbare mutex en condition_variable. 72 Harry Broeders 7

C++11 Synchronization Mutexen Locks Een lock maakt het gebruik van een mutex eenvoudiger en exception safe. Zie C++ exceptions (OGOPRG dictaat par.6.8). lock_guard Gebruikt RAII (Resource Acquisition Is Initialization): lock() mutex in constructor, unlock() mutex in destructor unique_lock Idem als lock_guard + lock(), try_lock() en unlock() memberfuncties Conditionele variabelen 73 C++11 Lock voorbeeld class Point { public: Point(): x(0), y(0) { void stepnortheast() { lock_guard<mutex> lock(m); ++x; ++y; bool isnortheast() const { lock_guard<mutex> lock(m); return x == y; private: mutable mutex m; int x, y; ; 74 Harry Broeders 8

C++11 Lock voorbeeld vector<int> v; mutex m; //... m.lock(); v.at(10) = 27; m.unlock(); m.lock(); try { v.at(10) = 27; m.unlock(); catch(...) { m.unlock(); throw; Niet handig! Wat gaat er mis als at een exception gooit? { Oplossing?! lock_guard<mutex> l(m); v.at(10) = 27; 75 C++11 Synchronization Mutexen Locks Conditionele variabelen conditional_variable void notify_one(); void notify_all(); void wait(unique_lock<mutex>& lock); void wait(unique_lock<mutex>& lock, pred_type pred); conditional_variable_any Idem maar werkt met elk type lock 76 Harry Broeders 9

C++11 Monitor voorbeeld #include <thread> #include <mutex> #include <condition_variable> int ei_teller = 0; mutex m; condition_variable c; // consumer thread(s) //... unique_lock<mutex> lock(m); while (ei_teller < 12) c.wait(lock); ei_teller -= 12; //... 77 C++ Monitor voorbeeld // producer thread(s) //... lock_guard<mutex> lock(m); ei_teller += n; c.notify_all(); //... Waarom moeten we notify_all gebruiken in plaats van notify_one? Omdat er meerdere consumers kunnen zijn en die moeten allemaal wakker gemaakt worden! 78 Harry Broeders 10

Monitor voorbeeld while (ei_teller < 12) c.wait(lock); // alternatief met predicate functie: bool predicate() { return ei_teller >= 12; //... c.wait(lock, &predicate); 79 Lambda functie C++11 Een lambda functie is een anonieme functie die eenmalig gebruikt wordt als een functie object (functor). De lambda functie wordt gedefinieerd op de plaats waar het functie object nodig is. Een lambda functie kan dus als predicate gebruikt worden. Harry Broeders 11

Monitor voorbeeld while (ei_teller < 12) c.wait(lock); // alternatief met predicate functie: bool predicate() { return ei_teller >= 12; //... c.wait(lock, &predicate); // alternatief met lambda functie c.wait(lock, []() { return ei_teller >= 12; ); Voordeel? Nadeel? eenvoudige syntax geen hergebruik mogelijk 81 Boost Synchronization Mutexen Locks Conditionele variabelen Barrier boost::barrier barrier(unsigned count); bool wait(); Een barrier is een ontmoetingspunt (rendezvous). Pas nadat count threads een wait hebben gedaan mogen ze samen verder. 82 Harry Broeders 12

C++11 Synchronization Mutexen Locks Conditionele variabelen C++11 kent geen barrier Huiswerk: Implementeer zelf eenbarrier class met de in C++11 beschikbare mutex en condition_variable. barrier(unsigned count); bool wait(); Een barrier is een ontmoetingspunt (rendezvous). Pas nadat count threads een wait hebben gedaan mogen ze samen verder. 83 C++11 concurrency Memory model Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics Harry Broeders 13

async en future Bedoeld om eenvoudig gebruik van concurrency mogelijk te maken. Met behulp van async kunnen we een functiefals een asynchrone taak starten. We krijgen dan een future object terug (van hetzelfde type als de functie f). We kunnen de memberfunctie get() van dit future object gebruiken om het resultaat van de (asynchrone) functie f op te vragen (indien nodig wordt er gewacht). De asynchrone taak kan in een aparte thread uitgevoerd worden (dat bepaald de implementatie / de programmeur). 85 async voorbeeld #include <vector> #include <iostream> using namespace std; int som(const vector<int>& v) { int s = 0; for (auto e: v) s += e; return s; int main() { vector<int> v1(10000000, 1); vector<int> v2( 5000000, 2); vector<int> v3( 5000000, 4); som=40000000 Tijdsduur: 7.97 sec som(v1), som(v2) en som(v3) kunnen parallel worden uitgevoerd. Hoe vertellen we dat aan de compiler? cout << "som=" << som(v1) + som(v2) + som(v3) << endl; cin.get(); return 0; 86 Harry Broeders 14

async voorbeeld #include <future> #include <vector> #include <iostream> using namespace std; int som(const vector<int>& v) { /* idem */ int main() { som=40000000 vector<int> v1(10000000, 1); Tijdsduur: 3.99 sec vector<int> v2( 5000000, 2); vector<int> v3( 5000000, 4); Waarom niet future<int> s1 = async(&som, ref(v1)); 3x zo snel? future<int> s2 = async(&som, ref(v2)); future<int> s3 = async(&som, ref(v3)); cout << "som=" << s1.get() + s2.get() + s3.get() << endl; cin.get(); return 0; De implementatie bepaald of er aparte theads worden gestart! 87 async voorbeeld(met auto) #include <future> #include <vector> #include <iostream> using namespace std; int som(const vector<int>& v) { /* idem */ int main() { vector<int> v1(10000000, 1); vector<int> v2( 5000000, 2); vector<int> v3( 5000000, 4); auto s1 = async(&som, ref(v1)); auto s2 = async(&som, ref(v2)); auto s3 = async(&som, ref(v3)); cout << "som=" << s1.get() + s2.get() + s3.get() << endl; cin.get(); return 0; De implementatie bepaald of er aparte theads worden gestart! 88 Harry Broeders 15

async voorbeeld #include <future> #include <vector> #include <iostream> using namespace std; int som(const vector<int>& v) { /* idem */ int main() { vector<int> v1(1000000, 1); vector<int> v2( 500000, 2); vector<int> v3( 500000, 4); De programmeur bepaald of er aparte theads worden gestart! Start aparte thread Start geen aparte thread auto s1 = async(launch::async, &som, ref(v1)); auto s2 = async(launch::deferred, &som, ref(v2)); auto s3 = async(launch::async, &som, ref(v3)); cout << "som=" << s1.get() + s2.get() + s3.get() << endl; cin.get(); return 0; 89 async voorbeeld(deferred) #include <future> #include <vector> #include <iostream> using namespace std; int som(const vector<int>& v) { /* idem */ int main() { vector<int> v1(10000000, 1); vector<int> v2( 5000000, 2); vector<int> v3( 5000000, 4); De implementatie start geen aparte theads! som=40000000 Tijdsduur: 7.92 sec auto s1 = async(launch::deferred, &som, ref(v1)); auto s2 = async(launch::deferred, &som, ref(v2)); auto s3 = async(launch::deferred, &som, ref(v3)); cout << "som=" << s1.get() + s2.get() + s3.get() << endl; cin.get(); return 0; 90 Harry Broeders 16

C++11 concurrency Memory model Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics Atomics Een variabele van het type atomic<t> kan (zonder problemen) gedeeld worden door meerdere threads. T kan alleen een POD (Plain Old Datatype) zijn. De implementatie bepaald of busy-waiting (lock-free) of locking wordt gebruikt. Lock-free is vaak sneller. 92 Harry Broeders 17

Mutex probleem #include <thread> #include <iostream> using namespace std; volatile int aantal = 0; void teller() { for (int i = 0; i < 100000; ++i) { ++aantal; int main(void) { thread t1(&teller), t2(&teller), t3(&teller); t1.join(); t2.join(); t3.join(); cout << "aantal = " << aantal << endl; return 0; aantal = 177395 aantal = 190237 aantal = 151421 $ time./a.exe aantal = 199184 0.065 s real 93 Mutex oplossing mutex #include <thread> #include <mutex> #include <iostream> using namespace std; int aantal = 0; mutex m; $ time./a.exe 2.397 s real void teller() { for (int i = 0; i < 100000; ++i) { m.lock(); ++aantal; m.unlock(); int main(void) { /* idem */ 94 Harry Broeders 18

Mutex oplossing lock_guard #include <thread> #include <mutex> #include <iostream> using namespace std; int aantal = 0; mutex m; $ time./a.exe 2.496 s real void teller() { for (int i = 0; i < 100000; ++i) { lock_guard<mutex> l(m); ++aantal; int main(void) { /* idem */ 95 Mutex oplossing atomic #include <thread> #include <atomic> #include <iostream> using namespace std; atomic<int> aantal(0); void teller() { for (int i = 0; i < 100000; ++i) { ++aantal; int main(void) { /* idem */ $ time./a.exe 0.610 s real 96 Harry Broeders 19

Vergelijk mutex oplossingen Programma Correct? Executietijd mutex_problem Nee 0.065 s mutex_solution_mutex Ja 2.397 s mutex_soution_guard_lock Ja 2.496 s mutex_solution_atomic Ja 0.610 s 97 Meer over C++11 concurrency... Memory model Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics C++ Concurrency in Action Practical Multithreading Anthony Williams February, 2012 528 pages ISBN: 9781933988771 Harry Broeders 20