Lehrstuhl für Datenverarbeitung. Technische Universität München. Leistungskurs C++ Multithreading

Ähnliche Dokumente
Lehrstuhl für Datenverarbeitung. Technische Universität München. Leistungskurs C++ Multithreading

Lehrstuhl für Datenverarbeitung. Technische Universität München. Leistungskurs C++ Multithreading

Master-Thread führt Programm aus, bis durch die Direktive

Beispiel: Schleifenparallelisierung

Shared-Memory Programmiermodelle

OpenMP - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009

Homogene Multi-Core-Prozessor-Architekturen

Lebenszyklus von Threads

Datenstrukturen und Algorithmen

Copy-on-write und Implicit Sharing in Qt

Parallele Prozesse. Prozeß wartet

Objektorientierte Programmierung Studiengang Medieninformatik

Java Concurrency Utilities

Einige Grundlagen zu OpenMP

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Implementieren von Klassen

Nebenläufige Programme mit Python

Threads. Foliensatz 8: Threads Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Computergrundlagen Moderne Rechnerarchitekturen

Computergrundlagen Moderne Rechnerarchitekturen

Institut fu r Informatik

Testen nebenläufiger Objekte

4. Parallelprogrammierung

Javakurs für Fortgeschrittene

race conditions deadlocks Modernes C++ Sharing data between threads Adrian Ziessler 5. Juni 2012 Adrian Ziessler Modernes C++ 5.

10. OLAPLINE-Anwendertreffen

Threading. Arthur Zaczek. Aug 2015

6. Der OpenMP Standard. Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++

Ausnahmebehandlung in Java

Kapitel 10 Delegationsvariablen

Threads und OpenMP. Frank Mietke Cluster- & Gridcomputing Frank Mietke 7/4/04

Repetitorium Programmieren I + II

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Betriebssysteme. Probeklausur. Olaf Spinczyk.

Funktionale und Objekt-Orientierte Programmierkonzepte

Parallel Regions und Work-Sharing Konstrukte

parallele Prozesse auf sequenziellen Prozessoren Ein Process ist ein typisches Programm, mit eigenem Addressraum im Speicher.

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Vorname: Nachname: Matrikelnummer: Klausur. Betriebssysteme

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

1. Motivation. Problemstellung: Dateninkonsistenzen (data races) aufgrund von konkurrierenden Zugriffen auf gemeinsame Daten sollen verhindert werden.

Parallele Programmierung mit OpenMP

1. Einführung in OpenMP

OpenMP. Viktor Styrbul

4. Parallelprogrammierung

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Gegenseitiger Ausschluss 102

C++ Klassen weitere Funktionen

Praktikum: Paralleles Programmieren für Geowissenschaftler

Prozesse. Prozesse sind Programme. Prozesse können aus Unterprozessen bestehen. Prozesshierarchie Unterprozesse Threads

Grundlagen in C# und.net

Vorlesung Informatik II

Hilfsblatt für C++ Prüfungen im 5. Semester

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Programmierung und Angewandte Mathematik

Statische und Nichtstatische Methoden Properties/ Eigenschaften

Pthreads. David Klaftenegger. Seminar: Multicore Programmierung Sommersemester

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Beispiel für überladene Methode

Klausur zur Vorlesung Informatik 1 im Wintersemester 2014/2015 am 18. Februar Bearbeitungszeit: 90 Minuten Gesamtpunktezahl: 90 Punkte

Praxisorientierte Einführung in C++ Lektion: "Virtuelle Methoden"

Laborskript Verteilte Systeme

Universität Karlsruhe (TH)

4. Parallelprogrammierung. AlDaBi Praktikum

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

12 Abstrakte Klassen, finale Klassen und Interfaces

JJ Prozesse und Nebenläufigkeit

Angewandte Mathematik und Programmierung

Parallel Processing in a Nutshell OpenMP & MPI kurz vorgestellt

Parallelisierung der Vektoraddition 149

Nebenläufigkeit mit Java

Objektorientierte Programmierung

Objektorientierung. Marc Satkowski 20. November C# Kurs

Teil I Debuggen mit gdb

Legende: Running Ready Blocked P1 P2 P3. t[ms] 1 Prozesse und Scheduling (16 Punkte)

Parallele Programmierung mit OpenMP

Rechnerarchitektur und Betriebssysteme (CS201): Semaphor, Monitor, Deadlocks, Re-Entrance

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Teil 2: Weitere Aspekte der Objektorientierung

Der Goopax Compiler GPU-Programmierung in C++ ZKI AK-Supercomputing, Münster, , Ingo Josopait

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Algorithmen und Datenstrukturen

Info B VL 17: Deadlocks

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Repetitorium Programmieren I + II

Threads Einführung. Zustände von Threads

Vorlesung Parallelrechner und Parallelprogrammierung, SoSe 2016

Universität Karlsruhe (TH)

Übung zu Betriebssysteme

Betriebssysteme. G: Parallele Prozesse. (Teil B: Klassische Problemstellungen, Mutual Exclusion, kritische Regionen)

Parallele Programmierung in C++ mit OpenMP

Transkript:

Leistungskurs C++ Multithreading

Zeitplan 16.10. Vorlesung 23.10. Vorlesung, Gruppeneinteilung 30.10. Vorlesung, HA1 06.11. Vorlesung, HA2 13.11. Vorlesung entfällt wegen SVV 20.11. Präsentation Vorprojekt 27.11. Präsentation Vorprojekt 04.12., 11.12., 18.12., 08.01. Working Sessions 15.01. Abschlusspräsentation 22.01. Abschlusspräsentation 29.01. Abschlusswettbewerb Leistungskurs C++ 2

Threading mit Qt Plattformübergreifende Thread-Klasse Leistungskurs C++ 3

QThread Plattformübergreifende Thread-Klasse class MyThread : public QThread { Q_OBJECT protected: void run(); }; void MyThread::run() {... } Leistungskurs C++ 4

QThread Thread wird durch Instanziieren des QThread Objekts erzeugt. Nach Aufruf von QThread::start() wird der Code in der run() Methode eigenständig ausgeführt. Der Thread wird beendet, wenn der Code in run() ausgeführt wurde. Die aufrufende Funktion läuft sofort weiter. Leistungskurs C++ 5

Eintrittsinvarianz und Threadsicherheit Klassen sind eintrittsinvariant (reentrant), wenn mehrere Instanzen des Objekts gleichzeitig ausgeführt werden können, ohne sich gegenseitig zu beeinflussen. Mehrere Threads können also Methoden von unterschiedlichen Instanzen aufrufen. Regeln: Kein Zugriff auf static oder globale Variablen Der eigene Code darf nicht verändert werden Kein Aufruf von Methoden, die nicht eintrittsinvariant sind Leistungskurs C++ 6

Eintrittsinvarianz und Threadsicherheit Klassen sind threadsicher (thread-safe), wenn mehrere Threads die gleiche Instanz gleichzeitig benutzen können. Eine threadsichere Klasse ist immer auch eintrittsinvariant. Regeln: Zugriff auf Memberdaten muss serialisiert werden. Leistungskurs C++ 7

Eintrittsinvarianz und Threadsicherheit Beispiel für Eintrittsinvarianz: class Counter { public: Counter() { n = 0; } void increment() { ++n; } void decrement() { --n; } int value() const { return n; } private: int n; }; Leistungskurs C++ 8

Eintrittsinvarianz und Threadsicherheit Beispiel für nicht eintrittsinvarianten Code: int t; void swap(int *x, int *y) { t = *x; *x = *y; // Erneuter Aufruf von swap *y = t; } Leistungskurs C++ 9

Eintrittsinvarianz und Threadsicherheit Funktionen sind threadsicher (thread-safe), wenn sie von mehreren Threads gleichzeitig ausgeführt werden können, ohne sich gegenseitig zu beeinflussen. Zugriff auf gemeinsame Speicherbereiche muss geregelt werden. Möglichkeiten hierfür bieten Mutexe (Mutual Exclusive Lock, bietet Zugriffsregelung auf ein Objekt) und Semaphore (bietet Zugriffsregelung auf mehrere Objekte) Leistungskurs C++ 10

Eintrittsinvarianz und Threadsicherheit Mutex (mutual exclusion) QMutex mutex; int number = 6; void method1() { mutex.lock(); number *= 5; number /= 4; mutex.unlock(); } Leistungskurs C++ 11

Eintrittsinvarianz und Threadsicherheit Semaphor bietet Zugriff auf mehrere Einheiten QSemaphore sem(5); // sem.available() == 5 sem.acquire(3); // sem.available() == 2 sem.acquire(2); // sem.available() == 0 sem.release(5); // sem.available() == 5 Leistungskurs C++ 12

Eintrittsinvarianz und Threadsicherheit Beispiel für threadsicheren Code: class Counter { public: Counter() { n = 0; } void increment() { QMutexLocker locker(&mutex); ++n; } void decrement() { QMutexLocker locker(&mutex); --n; } int value() const { QMutexLocker locker(&mutex); return n; } private: mutable QMutex mutex; int n; }; Leistungskurs C++ 13

Mögliche Fehler Race Condition void increment(int *n) { *n = *n + 1; } Undefiniertes Ergebnis bei Ausführung in mehreren Threads Leistungskurs C++ 14

Mögliche Fehler Deadlock wartet auf Ressource A belegt von Thread 1 Thread 2 belegt von Ressource B wartet auf Leistungskurs C++ 15

Mögliche Fehler Programme mit mehreren Threads sind kompliziert zu debuggen Wenn ein Thread abstürzt, stürzt das gesamte Programm ab Backtraces müssen auf jedem Thread einzeln untersucht werden Leistungskurs C++ 16

Multithreading mit QtConcurrent Automatische Erstellung von Threads und Aufteilung auf mehrere CPU-Kerne QtConcurrent::run() Führt einzelne Funktion in einem neuen Thread aus QtConcurrent::mapped() Führt eine Funktion auf allen Elementen einer Liste parallel aus Leistungskurs C++ 17

Multithreading mit OpenMP #include <omp.h> int main () { int nthreads, tid; #pragma omp parallel private(tid) { tid = omp_get_thread_num(); printf("hello World from thread = %d\n", tid); if (tid == 0) { nthreads = omp_get_num_threads(); printf("number of threads = %d\n", nthreads); } } } Leistungskurs C++ 18

Multithreading mit OpenMP #pragma omp parallel private(variablenname) private (list) firstprivate (list) lastprivate (list) shared (list) Variable ist nicht initialisiert Variable wird mit Anfangswert initialisiert Variable wird am Ende kopiert Alle Threads können auf die Variable zugreifen (Absicherung nötig) Leistungskurs C++ 19

Multithreading mit OpenMP #include <omp.h> void omp_set_num_threads(int num_threads) /* Anzahl der Threads setzen auch über Umgebungsvariable möglich */ OMP_NUM_THREADS=2 Leistungskurs C++ 20

Links OpenMP https://computing.llnl.gov/tutorials/openmp/ QThread http://qt-project.org/doc/qt-4.8/threads.html Leistungskurs C++ 21