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

Lebenszyklus von Threads

Implementieren von Klassen

Datenstrukturen und Algorithmen

Gegenseitiger Ausschluss 102

Testen nebenläufiger Objekte

Kapitel 10 Delegationsvariablen

C++ Klassen weitere Funktionen

Repetitorium Programmieren I + II

Javakurs für Fortgeschrittene

Objektorientierte Programmierung Studiengang Medieninformatik

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

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

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

Java Concurrency Utilities

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

Funktionale und Objekt-Orientierte Programmierkonzepte

Parallele Prozesse. Prozeß wartet

Pthreads. David Klaftenegger. Seminar: Multicore Programmierung Sommersemester

Threading. Arthur Zaczek. Aug 2015

Copy-on-write und Implicit Sharing in Qt

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

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

C++ - Objektorientierte Programmierung Konstante und statische Elemente

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

Vorname: Nachname: Matrikelnummer: Klausur. Betriebssysteme

Institut fu r Informatik

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

Ausnahmebehandlung in Java

Einstieg in die Informatik mit Java

10. OLAPLINE-Anwendertreffen

Sichtbarkeiten, Klassenmember und -methoden

Java Einführung Methoden. Kapitel 6

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

Programmierung Nachklausurtutorium

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

Philosophen-Problem mit Threads 99

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

C++ atomics, Boost.Lookfree, Hazard-Pointers und die Thread-Hölle

Algorithmen und Datenstrukturen

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

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

Vorlesung Informatik II

Statische und Nichtstatische Methoden Properties/ Eigenschaften

Java Einführung Klassendefinitionen

Effizientes Memory Debugging in C/C++

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Konstruktor/Destruktor

Laborskript Verteilte Systeme

Prozesszustände (1a)

Repetitorium Programmieren I + II

Objektorientierung. Marc Satkowski 20. November C# Kurs

Nebenläufige Programme mit Python

Nebenläufigkeit mit Java

Methoden und Wrapperklassen

A practical guide to C++

Threads Einführung. Zustände von Threads

Was machen wir heute? Betriebssysteme Tutorium 3. Organisatorisches. Prozesskontrollblock (PCB) Programmieraufgaben. Frage 3.1.a

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Objektorientierte Programmierung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Best Practices. Rainer Grimm Training, Coaching und Technologieberatung

Teil 2: Weitere Aspekte der Objektorientierung

Einstieg in die Informatik mit Java

JJ Prozesse und Nebenläufigkeit

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

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

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Homogene Multi-Core-Prozessor-Architekturen

6 Speicherorganisation

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Delegates. «Delegierter» Methoden Schablone Funktionszeiger. Dr. Beatrice Amrhein

Algorithmen und Datenstrukturen

Beispiel für überladene Methode

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

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Aufbau von Klassen. class punkt {...

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Unicode Support Atomic Operations Thread Support Type-Generic Makros Sicherheit Ease-of-Use C11. Thomas Duckardt

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

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr

Objektorientierung (OO)

C++ für alle. Praktische Neuerungen in C September 2012

Dr. Monika Meiler. Inhalt

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

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

Sommersemester Implementierung I: Struktur

Dezentrale Kontrolle: Aktive Objekte. Aktive Objekte Die Klasse AnimatorThread Aktivierung Objekte beobachten Die Java-Klasse Thread

Universität Karlsruhe (TH)

Javakurs für Anfänger

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

Applications will increasingly need to be concurrent if they want to fully exploit continuing exponential CPU throughput gains.

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

Grundlagen in C# und.net

Transkript:

Leistungskurs C++ Multithreading

Threading mit Qt Plattformübergreifende Thread-Klasse Sehr einfach zu benutzen Leider etwas schlecht dokumentiert Leistungskurs C++ 2

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

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. Wichtig: Nur der Code in run() läuft im neuen Thread, alle anderen Methoden, Slots, Member liegen im erzeugenden Thread (z.b. main) Leistungskurs C++ 4

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++ 5

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++ 6

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++ 7

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++ 8

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++ 9

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

Eintrittsinvarianz und Threadsicherheit Semaphor bietet Zugriffsschutz für mehrere gleichwertige Einheiten Anwendungsfall z.b. für Zugriff auf Ringpuffer (siehe QSemaphore Beispiel in Qt Dokumentation) 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++ 11

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++ 12

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

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

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++ 15

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++ 16

Threads in C++11 C++ Standard bietet seit 2011 eigene Thread-Klasse std::thread Erwartet Funktionszeiger als ersten Parameter des Konstruktors und beliebige weitere Parameter, die der Funktion übergeben werden. Zugriffsregelung über std::mutex std::lock_guard wird wie QMutexLocker verwendet Compiler muss neuen Standard unterstützen Compiler-Flags: -std=c++11 In qmake über QMAKE_CXXFLAGS setzen In cmake über CMAKE_CXXFLAGS setzen pthread Bibliothek muss (je nach Compiler) dazugelinkt werden Leistungskurs C++ 17

Links QThread http://qt-project.org/doc/qt-5.1/qtcore/thread-basics.html Leistungskurs C++ 21