Real-Time Systems (RTSYST) Week 3. 60 C++ concurrent programmeren C++ heeft sinds C++11 een standaard library voor concurrent programmeren. Alternatieve.

Slides:



Advertisements
Verwante presentaties
Inleiding programmeren in C++ Life Science & Technology 26 januari Universiteit Leiden.
Advertisements

Objectgeoriënteerd Programmeren in C++

Universiteit Leiden Inleiding programmeren in C++ Life Science & Technology 16 februari
Algoritmen en Datastructuren

HM-ES-th1 Les 9 Hardware/Software Codesign with SystemC.
JQuery en ASP.NET Bart De Meyer.
Inleiding programmeren in C++ Life Science & Technology 23 februari Universiteit Leiden.
PROS2 Les 12 Programmeren en Software Engineering 2.
Access en MySql Ynte Jan Kuindersma, BIRD Automation Nationale Officedag 2009 EDE, 14 Oktober 2009.
Inleiding computersystemen en netwerken deel 3 Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 6.1.
JAVA1 H 16. MULTITHREADING. 1. INLEIDING. Threads: delen van het programma die in concurrentie met elkaar gelijktijdig in executie gaan. Thread is een.
Gestructureerd programmeren in C
Real-Time Systems (RTSYST) Week 1. 2 Real-Time Systems (RTSYST) Onderwerpen: Concurrent programming (threads). Real-Time OS (VxWorks, QNX, FreeRTOS).
Tips Rudy 22/09/2013. Webgobbler Formatfactory p exe.
Inleiding programmeren in C++ Life Science & Technology 19 januari Universiteit Leiden.
OOP met Java Sessie 1.
MagentaPurpleTeal PinkOrangeBlue LimeBrown RedGreen Introductie C# /.NET
Biml en Data Vault.
GESPRG Les 14 Gestructureerd programmeren in C. 174 Details! The devil is in the details.
Voor VBA programmeurs Maurice de Beijer.  Maurice de Beijer.  The Problem Solver.  Visual Basic MVP.  Blog: theproblemsolver/default.aspxhttp://msmvps.com/blogs/
Speaking OData to SharePoint 2010 in a RESTful manner Michaël Hompus | Principal Developer | Winvision.
Greenfoot Workshop Bobby - Snake.
Wetenschap; ons nieuwe geloof? taal - kennis - werkelijkheid een filosofische verkenning 7. holisme of reductionisme?
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
De Tropische Storm “Allison” De ramp van 2001 in de US.
Java C++ zVeilig zMachine- onafhankelijk zVeel libraries, ook voor Internet-I/O zSnel zNative executables zLibraries optimaal voor specifiek OS.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Week 6.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Dagdeel 2.
Real-Time Systems (RTSYST) Week 2. Process/Thread states Scheduler = deel van OS dat de toestanden van processen/threads bepaald. OS gebruikt timerinterrupt.
GESPRG Les 8 Gestructureerd programmeren in C. 101 Array Meerdere variabelen van hetzelfde type kun je samennemen in één array variabele. Stel in een.
Real-Time Systems (RTSYST) Week IPC inter process communication Shared variabele based (H5) Message based (H6) Kan ook gebruikt worden in systemen.
GESPRG Les 12 Gestructureerd programmeren in C. 152 Huiswerk Uitwerking void reverse(int a[], int n) { int first = 0, last = n - 1; while (first < last)
Opg.1a: substring } String substring(int a) { int t; for (t=a; t
C++ handboek : C++ Leen Ameraal 6e druk academic service.
Programmeren met Algebra André van Delft 6 februari 2012 Presentatie op Grotius College Delft.
Inleiding programmeren in C++ Life Science & Technology 2 februari Universiteit Leiden.
Inleiding programmeren in C++ Life Science & Technology 9 februari Universiteit Leiden.
Homcom Ledenvergadering 17/12/2012. Google – Wat ? et/article/detail/ /2012/12/16/Google -goeroe-Vreemd-hoe-slecht-internet-wordt-
Conversie programma’s Woensdag 12 januari Wat is conversie? Het omzetten van een media-file (tekst, geluid, foto, video) van het ene formaat naar.
Visual Basic.Net - Overzicht
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Het ARM bord met wat library functies.
2PROJ5 – PIC assembler Hogeschool Utrecht / Institute for Computer, Communication and Media Technology 1 Les 3 - onderwerpen Instruction timing Shadow.
Microsoft Small Basic Cum 11/01/2009 Rudy. Basic Vroeger beschikten bijna alle homecomputers over basic als programmeertaal voor de gebruiker Altair BASIC.
The new standard in Logistics CAROZ Edgard Hendrikse Business Development Director.
Hoofdstuk 9 Objecten en klassen.
SharePoint 2013 Insights Een rondgang door Excel 2013, PowerPivot en Power View.
Microsoft Operations Manager & Scripting
Visual Basic 2010 – What’s new André Obelink
Performance evaluation Single vs multi-threaded boggle word searching Yves Wouters & Pieter-Jan Huyghe.
Arjen Kamphuis Infosecurity intro blijf de baas over je eigen bits.
We zijn toch allemaal zoekende?
EML en IMS Learning Design
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 7 onze.
Het geheim van Linked Data Marcel ReuversGeonovum CB-NL 20 november 2014.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 2 definitie.
Office macro woensdag 7 januari 2015.
Tircms03-p les 6 Templates. Functietemplates void verwissel(int &x, int &y); { int w=x;x=y;y=w;} Dezelfde functie voor meerdere types heet een functietemplate.
Animatie nAnimatie: “tekenfilm” programma toont automatisch veranderende beelden nGemakkelijk te programmeren met gebruik van de klasse Thread “draadje”
Inhoud  Vroeger en nu  Draadloosheid  Heden  De toekomst is in zicht.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag User-defined characters op de.
Music Share Nadia Abdoelrahman Demi Gemerts 4FD. Inhoud.
Tircms03-p les 1 C++ voor C-kenners Voor Technische Informatica.
Stef van Dijk. Inhoud Introductie Cookies? Waarom localStorage? Gebruik localStorage Demo localStorage Bronnen.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Een embedded systeem: ARM bord.
18 Februari 2013 Where friends have access to your privates!
De programmeertaal C++
LG-5 LG-6 LG-7 LG-8 LG-1 LG-2 LG-3 LG-4 LG-9 LG-10 LG-11 LG-12 LG-13
What Goes On While You’re Sleeping?
Transcript van de presentatie:

Real-Time Systems (RTSYST) Week 3

60 C++ concurrent programmeren C++ heeft sinds C++11 een standaard library voor concurrent programmeren. Alternatieve libraries: Boost Thread library Intel Threading Building Blocks (TBB) Microsoft Parallel Pattern Library (PPL) Open Multi-Processing (OpenMP) Er zijn ook uitbreidingen van C++ die concurrency aan de taal toevoegen (met taalconstructies). μC++ voegt o.a. taalconstructies task en monitor toe. Real-Time? Beschikbaar in MS VC++ ≥2012 en in GCC ≥4.7

C++11 concurrency Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics

62 C++11 Thread voorbeeld 1 (1) #include 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; }

63 C++11 Thread voorbeeld 1 (2) int main() { thread t1(&print1); thread t2(&print2); t1.join(); t2.join(); return 0; }

64 C++11 Thread voorbeeld 2 #include //... 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; } print1 print2 print1 print2 print1 print2 print1 print2 print1 print2 print1 print2 Wel type-safe (in tegenstelling tot pthreads).

65 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.

66 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

67 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 x==y Wat gebeurt er als deze class in een multi-threaded omgeving gebruikt wordt?

68 C++11 Mutex voorbeeld class TestPoint { private: Point p; void thread1() { for (int i = 0; i < ; ++i) p.stepNorthEast(); } void thread2() { for (int i = 0; i < ; ++i) 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; } }; Probleem! … Probleem! Einde.

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; } private: mutable mutex m; int x, y; }; Einde. Run-time Zonder mutex0.265 s Met mutex s Kan aangepast worden in const memberfunctie

70 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 <= && y >= 0 && y <= ; m.unlock(); return res; } private: mutable mutex m; int x, y; }; Je wilt niet onnodig wachten!

71 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 <= && && y >= 0 && y <= ; m.unlock_shared(); return res; } private: mutable boost::shared_mutex m; int x, y; }; isNorthEast() en isWithinLimits() kunnen nu parallel draaien!

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 een shared_mutex class met de in C++11 beschikbare mutex en condition_variable. 72

73 C++11 Synchronization Mutexen Locks 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 Een lock maakt het gebruik van een mutex eenvoudiger en exception safe. Zie C++ exceptions (OGOPRG dictaat par.6.8).

74 C++11 Lock voorbeeld class Point { public: Point(): x(0), y(0) { } void stepNorthEast() { lock_guard lock(m); ++x; ++y; } bool isNorthEast() const { lock_guard lock(m); return x == y; } private: mutable mutex m; int x, y; };

75 { lock_guard l(m); v.at(10) = 27; } C++11 Lock voorbeeld vector v; mutex m; //... m.lock(); v.at(10) = 27; m.unlock(); Wat gaat er mis als at een exception gooit? Oplossing ? m.lock(); try { v.at(10) = 27; m.unlock(); catch(...) { m.unlock(); throw; } Niet handig! Oplossing !

76 C++11 Synchronization Mutexen Locks Conditionele variabelen conditional_variable void notify_one(); void notify_all(); void wait(unique_lock & lock); void wait(unique_lock & lock, pred_type pred); conditional_variable_any Idem maar werkt met elk type lock

77 C++11 Monitor voorbeeld #include int ei_teller = 0; mutex m; condition_variable c; // consumer thread(s) //... unique_lock lock(m); while (ei_teller < 12) c.wait(lock); ei_teller -= 12; //...

78 C++ Monitor voorbeeld // producer thread(s) //... lock_guard 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!

79 Monitor voorbeeld while (ei_teller < 12) c.wait(lock); // alternatief met predicate functie: bool predicate() { return ei_teller >= 12; } //... c.wait(lock, &predicate);

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.

81 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

82 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.

83 C++11 Synchronization Mutexen Locks Conditionele variabelen C++11 kent geen barrier Huiswerk: Implementeer zelf een barrier 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.

C++11 concurrency Memory model Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics

async en future Bedoeld om eenvoudig gebruik van concurrency mogelijk te maken. Met behulp van async kunnen we een functie f als 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). kan De asynchrone taak kan in een aparte thread uitgevoerd worden (dat bepaald de implementatie / de programmeur). 85

86 async voorbeeld #include using namespace std; int som(const vector & v) { int s = 0; for (auto e: v) s += e; return s; } int main() { vector v1( , 1); vector v2( , 2); vector v3( , 4); cout << "som=" << som(v1) + som(v2) + som(v3) << endl; cin.get(); return 0; } som(v1), som(v2) en som(v3) kunnen parallel worden uitgevoerd. Hoe vertellen we dat aan de compiler? som= Tijdsduur: 7.97 sec

87 async voorbeeld #include using namespace std; int som(const vector & v) { /* idem */ } int main() { vector v1( , 1); vector v2( , 2); vector v3( , 4); future s1 = async(&som, ref(v1)); future s2 = async(&som, ref(v2)); future 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! som= Tijdsduur: 3.99 sec Waarom niet 3x zo snel?

88 async voorbeeld (met auto ) #include using namespace std; int som(const vector & v) { /* idem */ } int main() { vector v1( , 1); vector v2( , 2); vector v3( , 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!

89 async voorbeeld #include using namespace std; int som(const vector & v) { /* idem */ } int main() { vector v1( , 1); vector v2( , 2); vector v3( , 4); 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; } De programmeur bepaald of er aparte theads worden gestart! Start aparte thread Start geen aparte thread

90 async voorbeeld ( deferred ) #include using namespace std; int som(const vector & v) { /* idem */ } int main() { vector v1( , 1); vector v2( , 2); vector v3( , 4); 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; } De implementatie start geen aparte theads! som= Tijdsduur: 7.92 sec

C++11 concurrency Memory model Threads Synchronisatie Mutexen Locks Conditionele variabelen Call once Asynchrone taken en Futures Atomics

Een variabele van het type atomic 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

93 Mutex probleem #include using namespace std; volatile int aantal = 0; void teller() { for (int i = 0; i < ; ++i) { ++aantal; } int main(void) { thread t1(&teller), t2(&teller), t3(&teller); t1.join(); t2.join(); t3.join(); cout << "aantal = " << aantal << endl; return 0; } $./a.exe aantal = $./a.exe aantal = $./a.exe aantal = $ time./a.exe aantal = s real

94 Mutex oplossing mutex #include using namespace std; int aantal = 0; mutex m; void teller() { for (int i = 0; i < ; ++i) { m.lock(); ++aantal; m.unlock(); } int main(void) { /* idem */ $./a.exe aantal = $./a.exe aantal = $./a.exe aantal = $ time./a.exe aantal = s real

95 Mutex oplossing lock_guard #include using namespace std; int aantal = 0; mutex m; void teller() { for (int i = 0; i < ; ++i) { lock_guard l(m); ++aantal; } int main(void) { /* idem */ $./a.exe aantal = $./a.exe aantal = $./a.exe aantal = $ time./a.exe aantal = s real

96 Mutex oplossing atomic #include using namespace std; atomic aantal(0); void teller() { for (int i = 0; i < ; ++i) { ++aantal; } int main(void) { /* idem */ $./a.exe aantal = $./a.exe aantal = $./a.exe aantal = $ time./a.exe aantal = s real

Vergelijk mutex oplossingen 97 ProgrammaCorrect?Executietijd mutex_problemNee0.065 s mutex_solution_mutexJa2.397 s mutex_soution_guard_lockJa2.496 s mutex_solution_atomicJa0.610 s

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: