Locks 106. der Mutex wird noch nicht belegt es wird nicht-blockierend versucht, den Mutex zu belegen. std::defer_lock std::try_to_lock

Größe: px
Ab Seite anzeigen:

Download "Locks 106. der Mutex wird noch nicht belegt es wird nicht-blockierend versucht, den Mutex zu belegen. std::defer_lock std::try_to_lock"

Transkript

1 Locks 106 C++ bietet zwei Klassen an, um Locks zu halten: std::lock_guard und std::unique_lock. Beide Varianten unterstützen die automatische Freigabe durch den jeweiligen Dekonstruktor. In einfachen Fällen, bei denen es nur um den gegenseitigen Ausschluss geht, wird std::lock_guard verwendet. std::unique_lock bietet mehr Möglichkeiten. Dazu gehören insbesondere folgende Optionen: std::defer_lock std::try_to_lock std::adopt_lock der Mutex wird noch nicht belegt es wird nicht-blockierend versucht, den Mutex zu belegen ein bereits belegter Mutex wird übernommen Bei der Boost-Bibliothek gab es noch mehr solcher Klassen, u.a. boost::shared_lock, die jedoch nicht mehr in C++11 aufgenommen worden sind.

2 Deadlock-Vermeidung mit std::lock 107 { philo3.cpp std::unique_lock<std::mutex> lock1(left_fork, std::defer_lock); std::unique_lock<std::mutex> lock2(right_fork, std::defer_lock); std::lock(lock1, lock2); print_status("picks up both forks and is dining"); C++ bietet mit std::lock eine Operation an, die beliebig viele Mutex-Variablen beliebigen Typs akzeptiert, und diese in einer vom System gewählten Reihenfolge belegt, die einen Deadlock vermeidet. Normalerweise erwartet std::lock Mutex-Variablen. std::unique_lock ist eine Verpackung, die wie eine Mutex-Variable verwendet werden kann. Zunächst nehmen die beiden std::unique_lock die Mutex-Variablen jeweils in Beschlag, ohne eine lock-operation auszuführen (std::defer_lock). Danach werden nicht die originalen Mutex-Variablen, sondern die std::unique_lock-objekte an std::lock übergeben. Diese Variante ist umfassend auch gegen Ausnahmenbehandlungen abgesichert.

3 Monitore 108 Ein Monitor ist eine Klasse, bei der maximal ein Thread eine Methode aufrufen kann. Wenn weitere Threads konkurrierend versuchen, eine Methode aufzurufen, werden sie solange blockiert, bis sie alleinigen Zugriff haben (gegenseitiger Ausschluss). Der Begriff und die zugehörige Idee gehen auf einen Artikel von 1974 von C. A. R. Hoare zurück. Aber manchmal ist es sinnvoll, den Aufruf einer Methode von einer weiteren Bedingung abhängig zu machen,

4 Monitore mit Bedingungen 109 Bei Monitoren können Methoden auch mit Bedingungen versehen werden, d.h. eine Methode kommt nur dann zur Ausführung, wenn die Bedingung erfüllt ist. Wenn die Bedingung nicht gegeben ist, wird die Ausführung der Methode solange blockiert, bis sie erfüllt ist. Eine Bedingung sollte nur von dem internen Zustand eines Objekts abhängen. Bedingungsvariablen sind daher private Objekte eines Monitors mit den Methoden wait, notify_one und notify_all. Bei wait wird der aufrufende Thread solange blockiert, bis ein anderer Thread bei einer Methode des Monitors notify_one oder notify_all aufruft. (Bei notify_all können alle, die darauf gewartet haben, weitermachen, bei notify_one nur ein Thread.) Eine Notifizierung ohne darauf wartende Threads ist wirkungslos.

5 Pattern bei Monitoren mit Bedingungen 110 class Monitor { public: void some_method() { std::unique_lock<std::mutex> lock(mutex); while (! /* some condition */) { condition.wait(lock); //... void other_method() { std::unique_lock<std::mutex> lock(mutex); //... condition.notify_one(); private: std::mutex mutex; std::condition_variable condition; ; Bei der C++11-Standardbibliothek ist eine Bedingungsvariable immer mit einer Mutex-Variablen verbunden. wait gibt den Lock frei, wartet auf die Notifizierung, wartet dann erneut auf einen exklusiven Zugang und kehrt dann zurück.

6 Verknüpfung von Bedingungs- und Mutex-Variablen 111 Die Methoden notify_one oder notify_all sind wirkunslos, wenn kein Thread auf die entsprechende Bedingung wartet. Wenn ein Thread feststellt, dass gewartet werden muss und danach wartet, dann gibt es ein Fenster zwischen der Feststellung und dem Aufruf von wait. Wenn innerhalb des Fensters notify_one oder notify_all aufgerufen wird, bleibt dieses wirkungslos und beim anschließenden wait kann es zu einem Deadlock kommen, da dies auf eine Notifizierung wartet, die nun nicht mehr kommt. Damit das Fenster völlig geschlossen wird, muss wait als atomare Operation zuerst den Thread in die Warteschlange einreihen und erst dann den Lock freigeben. Bei std::condition_variable muss der Lock des Typs std::unique_lock<std::mutex> sein. Für andere Locks gibt es die u.u. weniger effiziente Alternative std::condition_variable_any.

7 Bedingungsvariablen 112 M (P 1 P 2 CL) C M = (lock unlock M) P 1 P 2 = (lock wait resume critical_region 1 unlock P 1 ) = (lock critical_region 2 (notify unlock P 2 unlock P 2 )) CL = (unlock C unlock unlocked C lock C lock locked C CL) C = (wait unlock C unlocked C notify lock C locked C resume C) Einfacher Fall mit M für die Mutex-Variable, einem Prozess P 1, der auf eine Bedingungsvariable wartet, einem Prozess P 2, der notifiziert oder es auch sein lässt, und der Bedingungsvariablen C, die hilfsweise CL benötigt, um gemeinsam mit P 1 und P 2 um die Mutexvariable konkurrieren zu können.

8 Definition eigener Locks 113 Wenn notwendig, können auch eigene Klassen für Locks definiert werden. Die Template-Klasse std::lock_guard akzeptiert eine beliebige Lock-Klasse, die mindestens folgende Methoden unterstützt: void lock() void unlock() blockiere, bis der Lock reserviert ist gib den Lock wieder frei Typhierarchien und virtuelle Methoden werden hierfür nicht benötigt, da hier statischer Polymorphismus vorliegt, bei dem mit Hilfe von Templates alles zur Übersetzzeit erzeugt und festgelegt wird. In einigen Fällen (wie etwa die Übergabe an std::lock) wird auch noch folgende Methode benötigt: bool try_lock() versuche nicht-blockierend den Lock zu reservieren

9 Locks für Resourcen mit einer Kapazität 114 class ResourceLock { public: ResourceLock(unsigned int capacity_) : capacity(capacity_), used(0) { void lock() { std::unique_lock<std::mutex> lock(mutex); if (used == capacity) { released.wait(lock); ++used; void unlock() { std::unique_lock<std::mutex> lock(mutex); assert(used > 0); --used; released.notify_one(); private: const unsigned int capacity; unsigned int used; std::mutex mutex; std::condition_variable released; ; resource-lock.hpp

10 Philosophen mit Diener 115 philo4.cpp constexpr unsigned int PHILOSOPHERS = 5; ResourceLock rlock(philosophers-1); std::thread philosopher[philosophers]; std::mutex fork[philosophers]; for (int i = 0; i < PHILOSOPHERS; ++i) { philosopher[i] = std::thread(philosopher(i+1, fork[i], fork[(i + PHILOSOPHERS - 1) % PHILOSOPHERS], rlock)); Mit Hilfe eines ResourceLock lässt sich das Philosophenproblem mit Hilfe eines Dieners lösen. Bei n Philosophen lassen die Diener zu, dass sich n 1 Philosophen hinsetzen.

11 Philosophen mit Diener 116 void operator()() { for (int i = 0; i < 5; ++i) { print_status("comes to the table"); { std::lock_guard<resourcelock> lock(rlock); print_status("got permission to sit down at the table"); { std::lock_guard<std::mutex> lock1(left_fork); print_status("picks up the left fork"); { std::lock_guard<std::mutex> lock2(right_fork); print_status("picks up the right fork"); { print_status("is dining"); print_status("returns the right fork"); print_status("returns the left fork"); print_status("leaves the table"); philo4.cpp

12 Ringpuffer 117 Ringpuffer sind FIFO-Queues auf Basis eines festdimensionierten Arrays. Die Pipelines unter UNIX werden intern auf Basis von Ringpuffern realisiert. Typischerweise hat ein Ringpuffer die Methoden read und write. Die Methode read hat als Vorbedingung, dass es etwas zu lesen gibt, d.h. der Puffer darf nicht leer sein. Die Methode write hat als Vorbedingung, dass es noch Platz zum Schreiben gibt, d.h. der Puffer darf nicht vollständig gefüllt sein.

13 Ringpuffer 118 #include <vector> #include <mutex> #include <condition_variable> ringbuffer.hpp template<typename T> class RingBuffer { public: RingBuffer(unsigned int size) : /*... */ { void write(t item) { /*... */ void read(t& item) { /*... */ private: unsigned int read_index; unsigned int write_index; unsigned int filled; std::vector<t> buf; std::mutex mutex; std::condition_variable ready_for_reading; std::condition_variable ready_for_writing; ; Die beiden Bedingungen werden durch ready_for_reading und ready_for_writing repräsentiert.

14 Initialisierung eines Ringpuffers 119 RingBuffer(unsigned int size) : read_index(0), write_index(0), filled(0), buf(size) { Zu Beginn sind beide Indizes und der Füllgrad bei 0. ringbuffer.hpp Der Puffer wird in Abhängigkeit der gegebenen Größe dimensioniert.

15 Schreiben in einen Ringpuffer 120 void write(t item) { std::unique_lock<std::mutex> lock(mutex); while (filled == buf.capacity()) { ready_for_writing.wait(lock); buf[write_index] = item; write_index = (write_index + 1) % buf.capacity(); ++filled; ready_for_reading.notify_one(); ringbuffer.hpp Wenn der Puffer bereits voll ist, wird mit Hilfe der Bedingungsvariablen ready_for_writing darauf gewartet, dass wieder Kapazität frei wird. Prinzipiell könnte die while-schleife durch eine if-anweisung ersetzt werden. So ist der Programmtext jedoch etwas robuster. Wenn die Pufferkapazität erhöht wird, ist zu bedenken, dass möglicherweise ein anderer Thread darauf wartet.

16 Lesen von einem Ringbuffer 121 void read(t& item) { std::unique_lock<std::mutex> lock(mutex); while (filled == 0) { ready_for_reading.wait(lock); item = buf[read_index]; read_index = (read_index + 1) % buf.capacity(); --filled; ready_for_writing.notify_one(); ringbuffer.hpp Dazu symmetrisch ist die Lese-Methode, die zu Beginn sicherstellt, dass es etwas zu Lesen gibt.

17 Rendezvous 122 Idee: Zu einer konkurierrend benutzten Datenstruktur gehört ein eigener Thread. Dieser greift alleine auf die Datenstruktur zu und kann somit auch nicht in Konflikt geraten. Andere Threads, die auf die Datenstruktur zugreifen wollen, müssen mit dem die Datenstruktur kontrollierenden Thread kommunizieren. Diese synchronen Begegnungen zwischen Threads nennen sich Rendezvous. Geprägt wurde der Begriff durch Ada, das sich in dieser Beziehung sehr an CSP anlehnte.

18 Ringpuffer in Ada nach Ichbiah 123 task BUFFERING is entry READ (V : out ITEM); entry WRITE(E : in ITEM); end; task body BUFFERING is SIZE : constant INTEGER := 10; BUFFER : array (1.. SIZE) of ITEM; INX, OUTX : INTEGER range 1.. SIZE := 1; COUNT : INTEGER range 0.. SIZE := 0; begin loop select when COUNT < SIZE => accept WRITE(E : in ITEM) do BUFFER(INX) := E; end; INX := INX mod SIZE + 1; COUNT := COUNT + 1; or when COUNT > 0 => accept READ (V : out ITEM) do V := BUFFER(OUTX); end; OUTX := OUTX mod SIZE + 1; COUNT := COUNT - 1; end select; end loop; end BUFFERING;

19 Umsetzung von Rendezvous in C Zwischen den beiden Threads existiert eine Kommunikations-Datenstruktur, auf die konkurrierend zugegriffen wird. (Ja, das wollen wir generell vermeiden, aber zur Umsetzung von Rendezvous wird dies genau einmal benötigt.) Diese Kommunikations-Datenstruktur nimmt Anfragen auf, die Methodenaufrufen entsprechen. Jedes dieser Objekte besteht aus einer Bezeichnung der Anfrage (Entry) und einem Objekt mit dem Parametern (Request). Bei einem Methodenaufruf wird dann so eine Anfrage erzeugt, in die Datenstruktur abgelegt und auf die Bearbeitung gewartet. Der andere Thread sucht sich dann gelegentlich eine der Anfragen aus, die bearbeitbar sind, bearbeitet sie und markiert sie dann als erledigt. Danach kann der anfragende Thread wieder aufgeweckt werden.

20 Ringpuffer auf Basis von Rendezvous 125 enum Entry {RingBufferRead, RingBufferWrite; template<typename T> struct Request { Request() : itemptr(0) {; Request(T* ip) : itemptr(ip) {; T* itemptr; ; rv-ringbuffer.hpp Jede Methode entspricht ein Wert beim Aufzählungsdatentyp Entry. Bei einem Ringpuffer haben wir nur die Methoden read und write. Alle Parameter aller Methodenaufrufe werden in der Datenstruktur Request zusammengefasst. Das ist hier nur ein Zeiger auf ein Objekt, das in den Ringpuffer hineinzulegen oder aus diesem herauszunehmen ist.

21 Datenstruktur für eine Anfrage 126 struct Member { Member() {; Member(const Entry& e, const Request& r) : entry(e), req(r), done(new std::condition_variable()) { ; Member(const Member& other) : entry(other.entry), req(other.req), done(other.done) {; Entry entry; Request req; std::shared_ptr<std::condition_variable> done; ; rendezvous.hpp Eine Struktur des Datentyp Member fasst Entry, Request und eine Bedingungsvariable done zusammen. Die Bedingungsvariable signalisiert, wann die Anfrage erledigt ist. Da diese Datenstruktur in Container hinein- und herauskopiert wird, ist es notwendig, die Bedingungsvariable hinter einem Zeiger zu verstecken. Das Aufräumen übernimmt hier std::shared_ptr.

22 Warteschlangen mit Anfragen 127 typedef std::list<member> Queue; typedef std::map<entry, Queue> Requests; Requests requests; rendezvous.hpp Alle Anfragen, die die gleiche Methode (Entry) betreffen, werden in eine Warteschlange (Queue) zusammengefasst. Alle Warteschlangen sind über ein assoziatives Array zugänglich (Requests). Der konkurrierende Zugriff wird über mutex und submitted geregelt. Letzteres signalisiert das Hinzufügen einer Anfrage. std::mutex mutex; std::condition_variable submitted; rendezvous.hpp

23 Einreichen einer Anfrage 128 template<typename Request, typename Entry> class Rendezvous { public: //... rendezvous.hpp ; void connect(entry entry, Request request) { Member member(entry, request); // submit request std::unique_lock<std::mutex> lock(mutex); requests[entry].push_back(member); submitted.notify_all(); // wait for its completion member.done->wait(lock); private: //... connect wird zum Einreichen einer Anfrage verwendet: Nach dem Eintragen in die passende Warteschlange wird auf die Erledigung gewartet.

24 Abbildung von Methoden zu Anfragen 129 rv-ringbuffer.hpp template< typename T, typename RT = Request<T> > class RingBuffer: RendezvousTask<RT, Entry> { public: RingBuffer(unsigned int size) : read_index(0), write_index(0), filled(0), buf(size) { assert(size > 0); this->start(); /* start the associated thread */ void write(t item) { this->rv.connect(ringbufferwrite, RT(&item)); void read(t& item) { this->rv.connect(ringbufferread, RT(&item)); //... private: unsigned int read_index; unsigned int write_index; unsigned int filled; std::vector<t> buf; ;

25 Auswählen einer Anfrage 130 rendezvous.hpp Entry select(const EntrySet& entries) throw(terminationexception) { assert(entries.size() > 0); /* deadlock otherwise */ std::unique_lock<std::mutex> lock(mutex); for(;;) { for (auto& entry: entries) { if (requests.find(entry)!= requests.end()) { return entry; submitted.wait(lock); if (terminating) throw TerminationException(); select gehört zur Template-Klasse Rendezvous und erhält eine Menge akzeptabler Anfragen (entries). Es wird dann überprüft, ob so eine Anfrage vorliegt. Falls nicht, wird darauf gewartet. Die Variable terminating dient später dazu, den Thread kontrolliert wieder abzubauen.

26 Ablauf des Ringpuffer-Threads 131 template< typename T, typename RT = Request<T> > class RingBuffer: RendezvousTask<RT, Entry> { public: //... rv-ringbuffer.hpp ; virtual void operator()() { for(;;) { // task body... private: //... Der für den Ringpuffer zuständige Thread wird von dem Funktionsoperator repräsentiert. Diese wird indirekt von der Template-Klasse RendezvousTask aufgerufen, die in der Methode start den Thread startet.

27 Auswahl der nächsten Anfrage 132 std::set<entry> entries; if (filled > 0) { entries.insert(ringbufferread); if (filled < buf.capacity()) { entries.insert(ringbufferwrite); Entry entry = this->rv.select(entries); switch (entry) { case RingBufferRead: //... break; case RingBufferWrite: //... break; rv-ringbuffer.hpp Zuerst wird festgestellt, welche Anfragen zulässig sind und eine entsprechende Menge erstellt. Dann wird mit select auf das Eintreffen einer entsprechenden Anfrage gewartet bzw. sie ausgewählt.

28 Bearbeitung einer read-anfrage 133 case RingBufferRead: { RT request; typename Rendezvous<RT, Entry>::Accept(this->rv, RingBufferRead, request); *(request.itemptr) = buf[read_index]; read_index = (read_index + 1) % buf.capacity(); --filled; break; Entscheidend ist die Frage, wann eine Anfrage erledigt ist. rv-ringbuffer.hpp Dies ist hier durch die Lebensdauer des Accept-Objekts geregelt. Sobald dieses dekonstruiert wird, ist die Frage erledigt und der anfragende Thread kann weiterarbeiten.

29 Bearbeitung einer write-anfrage 134 case RingBufferWrite: { RT request; typename Rendezvous<RT, Entry>::Accept(this->rv, RingBufferWrite, request); buf[write_index] = *(request.itemptr); write_index = (write_index + 1) % buf.capacity(); ++filled; break; rv-ringbuffer.hpp Das seltsame Konstrukt this >rv an Stelle von rv (als Verweis auf das zugehörige Rendezvous-Objekt) ist notwendig, weil die Basisklasse von Template-Parametern abhängt und daher nur eingeschränkt sichtbar ist.

30 Herausnehmen einer Anfrage 135 class Accept { public: Accept(Rendezvous& rv, Entry entry, Request& request) throw(terminationexception) : lock(rv.mutex) { typename Requests::iterator it; for(;;) { it = rv.requests.find(entry); if (it!= rv.requests.end()) break; rv.submitted.wait(lock); if (rv.terminating) throw TerminationException(); member = it->second.front(); request = member.req; it->second.pop_front(); if (it->second.empty()) { rv.requests.erase(it); ~Accept() { member.done->notify_all(); private: Member member; std::unique_lock<std::mutex> lock; ; rendezvous.hpp

31 Abbau eines Threads 136 Grundsätzlich ist der Abbau von Objekten mit zugehörigen Threads nicht-trivial. Die Threads-Bibliothek besteht darauf, dass jedes std::mutex-objekt beim Abbau ungelockt sein muss, niemand auf eine std::condition_variable wartet und join aufgerufen sein muss, Entsprechend muss allen beteiligten Parteien der Abbau signalisiert werden; diese müssen darauf reagieren (z.b. durch Ausnahmenbehandlungen) und es muss darauf gewartet werden, dass dies alles abgeschlossen ist.

32 Ausnahme für die Terminierung 137 struct TerminationException: public std::exception { public: virtual const char* what() const throw() { return "thread has been terminated"; ; rendezvous.hpp Für die Ausnahmenbehandlung zur Terminierung wird sinnvollerweise eine eigene Klasse definiert. Hier erfolgt dies als Erweiterung von std::exception, wobei die Methode what überdefiniert wird, die einen lesbaren Text zurückliefert.

33 Basisklasse für Rendezvous-Threads 138 template<typename Request, typename Entry> class RendezvousTask { public: RendezvousTask() { // empty, postpone initialization of t to start virtual ~RendezvousTask() { /* initiate termination of the thread associated to the Rendezvous object... */ rv.terminate(); /*... and wait for its completion */ t.join(); virtual void operator()() = 0; //... protected: // to be invoked by the most-derived constructor void start() { t = std::thread(thread(*this)); Rendezvous<Request, Entry> rv; private: // associated thread std::thread t; rendezvous.hpp ; // used for the synchronized termination std::mutex mutex; std::condition_variable terminating;

34 Thread-Klasse in RendezvousTask 139 class Thread { public: Thread(RendezvousTask& _rt) : rt(_rt) { void operator()() { try { rt(); catch (TerminationException& e) { /* ok, simply return */ protected: RendezvousTask& rt; ; Ein Objekt dieser Klasse wird an std::thread übergeben. Aufgerufen wird die polymorphe Funktionsmethode. rendezvous.hpp Wenn die Terminierung als Ausnahme eintrifft, wird mit rt.terminating signalisiert, dass der Thread abgebaut wurde.

35 Ablauf der Terminierung 140 virtual ~RendezvousTask() { /* initiate termination of the thread associated to the Rendezvous object... */ rv.terminate(); /*... and wait for its completion */ t.join(); rendezvous.hpp Wenn das Objekt, das mit dem Thread zusammenhängt, terminiert, dann wird dieser Dekonstruktor aufgerufen. Dieser initiiert zuerst die Terminierung des Rendezvous-Objekts...

36 Ablauf der Terminierung 141 void terminate() { terminating = true; submitted.notify_all(); rendezvous.hpp Die terminate-methode des Rendezvous-Objekts merkt sich, dass die Terminierung anläuft und weckt alle wartenden Threads auf.

37 Ablauf der Terminierung 142 rv.submitted.wait(lock); if (rv.terminating) throw TerminationException(); rendezvous.hpp An den einzelnen Stellen, wo auf das Eintreffen einer Anfrage gewartet wird, muss überprüft werden, ob eine Terminierung vorliegt. Falls ja, muss die entsprechende Ausnahme initiiert werden. Diese führt dann zum Abbau des gesamten Threads der betreffenden Tasks, wobei implizit auch alle Locks freigegeben werden.

Gegenseitiger Ausschluss 102

Gegenseitiger Ausschluss 102 Gegenseitiger Ausschluss 102 MX = M (P 1... P n ) M = (lock unlock M) P i = (lock begin_critical_region i end_critical_region i unlock private_work i P i ) n Prozesse P 1... P n wollen konkurrierend auf

Mehr

Philosophen-Problem mit Threads 99

Philosophen-Problem mit Threads 99 Philosophen-Problem mit Threads 99 int main() { constexpr unsigned int PHILOSOPHERS = 5; std::thread philosopher[philosophers]; std::mutex fork[philosophers]; for (int i = 0; i < PHILOSOPHERS; ++i) { philosopher[i]

Mehr

Backtracking: 8-Damen-Problem

Backtracking: 8-Damen-Problem Backtracking: 8-Damen-Problem 79 8 QZ0Z0Z0Z 7 Z0Z0L0Z0 6 0Z0Z0Z0L 5 Z0Z0ZQZ0 4 0ZQZ0Z0Z 3 Z0Z0Z0L0 2 0L0Z0Z0Z 1 Z0ZQZ0Z0 a b c d e f g h Problem: Finde alle Stellungen für n Damen auf einem Schachbrett

Mehr

Aufwand für Threads 124

Aufwand für Threads 124 Aufwand für Threads 124 #include #include #include #include thread-overhead.cpp int main() { unsigned int counter = 0; unsigned int nof_threads = 1

Mehr

Polymorphe for-anweisung 237

Polymorphe for-anweisung 237 Polymorphe for-anweisung 237 Beginnend mit C++11 wird for (for-range-declaration : expression) statement durch den Übersetzer zu folgendem Programmtext expandiert: { auto&& range = (expression); for (auto

Mehr

Polymorphismus 44. Function.hpp. #include <string>

Polymorphismus 44. Function.hpp. #include <string> Polymorphismus 44 #include Function.hpp class Function { public: virtual ~Function() {}; virtual const std::string& get_name() const = 0; virtual double execute(double x) const = 0; }; // class

Mehr

Info B VL 17: Deadlocks

Info B VL 17: Deadlocks Info B VL 17: Deadlocks Objektorientiere Programmierung in Java 2003 Ute Schmid (Vorlesung) Elmar Ludwig (Übung) FB Mathematik/Informatik, Universität Osnabrück Info B VL 17: Deadlocks p.327 Conditional

Mehr

JJ Prozesse und Nebenläufigkeit

JJ Prozesse und Nebenläufigkeit 1 Wiederholung: Algorithmus von Peterson boolean ready0=false, ready1=false; int turn=0; JJ Prozesse und Nebenläufigkeit (Auszug aus der Vorlesung) while( 1 ) Prozess 0 ready0 = true; turn = 1; while(

Mehr

Polymorphismus 179. Function.h. #include <string>

Polymorphismus 179. Function.h. #include <string> Polymorphismus 179 #include Function.h class Function { public: virtual ~Function() {}; virtual std::string get_name() const = 0; virtual double execute(double x) const = 0; }; // class Function

Mehr

Objektorientierte Programmierung mit C++ SS 2007

Objektorientierte Programmierung mit C++ SS 2007 Objektorientierte Programmierung mit C++ SS 2007 Andreas F. Borchert Universität Ulm 5. Juni 2007 Polymorphismus #include Function.h class Function { public: virtual ~Function() {}; virtual std::string

Mehr

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

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen Thread-Synchronisation in in Java Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen Die Klasse Thread Die Die Klasse Thread gehört zur zur Standardbibliothek von von

Mehr

Leser-Schreiber-Realisierung mit Semaphoren

Leser-Schreiber-Realisierung mit Semaphoren Leser-Schreiber-Realisierung mit Semaphoren Reader: down(semwriter); down(semcounter); rcounter++; up(semwriter); read(); down(semcounter); rcounter--; Writer: Problem: down(semwriter); Busy Waiting siehe

Mehr

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

Lehrstuhl für Datenverarbeitung. Technische Universität München. Leistungskurs C++ Multithreading 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

Mehr

Intelligente Zeiger 326

Intelligente Zeiger 326 Intelligente Zeiger 326 smart pointer regular pointer administrative info object contents Intelligente Zeiger (smart pointers) entsprechend weitgehend normalen Zeigern, haben aber Sonderfunktionalitäten

Mehr

Wie teuer ist dynamischer Polymorphismus? 194

Wie teuer ist dynamischer Polymorphismus? 194 Wie teuer ist dynamischer Polymorphismus? 194 Function f vtable data RTTI ~Function get_name type name type info "Sinus\0" execute Nicht-polymorphe Methoden und reguläre Funktionen können in C++ direkt

Mehr

Aufgabenblatt 8 Musterlösung

Aufgabenblatt 8 Musterlösung Prof. Dr. rer. nat. Roland Wismüller Aufgabenblatt 8 Musterlösung Vorlesung Betriebssysteme I Wintersemester 2017/18 Aufgabe 1: Erzeuger-Verbraucher Synchronisation (Bearbeitung in der Übungsstunde) Erzeuger-Verbraucher-Problem:

Mehr

Programmierkurs C++ Templates & STL (1/2)

Programmierkurs C++ Templates & STL (1/2) Programmierkurs C++ Templates & STL (1/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer #2 Templates Die wichtigsten objekt-orientierten

Mehr

Proseminar Nichtsequentielle Programmiersprachen WS 2011/2012 Monitore

Proseminar Nichtsequentielle Programmiersprachen WS 2011/2012 Monitore Fachbereich Mathematik und Informatik Institut für Informatik Proseminar Nichtsequentielle Programmiersprachen WS 2011/2012 Monitore Sascha Kretzschmann 2. November 2011 Inhaltsverzeichnis 1 Einleitung

Mehr

Datenstrukturen und Algorithmen

Datenstrukturen und Algorithmen 1 Datenstrukturen und Algorithmen Übung 13 FS 2018 Programm von heute 2 1 Feedback letzte Übung 2 Wiederholung Theorie 3 Nächste Übung 1. Feedback letzte Übung 3 Aufgabe 12.3: Summe eines Vektors void

Mehr

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

DAP2-Programmierpraktikum Einführung in C++ (Teil 2) DAP2-Programmierpraktikum Einführung in C++ (Teil 2) Carsten Gutwenger 18. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Dynamischer Speicher Klassen und

Mehr

Monitore. Klicken bearbeiten

Monitore. Klicken bearbeiten Sascha Kretzschmann Institut für Informatik Monitore Formatvorlage und deren Umsetzung des Untertitelmasters durch Klicken bearbeiten Inhalt 1. Monitore und Concurrent Pascal 1.1 Warum Monitore? 1.2 Monitordefinition

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung Ausnahmebehandlung und Nebenläufigkeit 9. Vorlesung am 15. Dezember 2010 Ausnahmebehandlung in Java class A { void foo() throws Help, SyntaxError {... class B extends A

Mehr

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

C++ atomics, Boost.Lookfree, Hazard-Pointers und die Thread-Hölle C++ atomics, Boost.Lookfree, Hazard-Pointers und die Thread-Hölle Aachen, den 14. Januar 2016 Max Neunhöffer www.arangodb.com Unser Problem heute Es war einmal... eine multi-threaded Applikation, mit einer

Mehr

Betriebssysteme Teil 11: Interprozess-Kommunikation

Betriebssysteme Teil 11: Interprozess-Kommunikation Betriebssysteme Teil 11: Interprozess-Kommunikation 19.12.15 1 Übersicht Grundbegriffe Shared Memory Pipelines Messages Ports Sockets 2 Grundbegriffe Interprocess-Kommunikation = Austausch von Daten über

Mehr

Repetitorium Programmieren I + II

Repetitorium Programmieren I + II Repetitorium Programmieren I + II Stephan Gimbel Johanna Mensik Michael Roth 6. März 2012 Agenda 1 Operatoren 2 Datentypen Gleitpunkt Zahl Typkonvertierung 3 Strommanipulatoren 4 Bedingungen if-else switch-case

Mehr

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

Betriebssysteme. G: Parallele Prozesse. (Teil B: Klassische Problemstellungen, Mutual Exclusion, kritische Regionen) Betriebssysteme G: Parallele Prozesse (Teil B: Klassische Problemstellungen, Mutual Exclusion, kritische Regionen) 1 Allgemeine Synchronisationsprobleme Wir verstehen ein BS als eine Menge von parallel

Mehr

Einführung in die Programmierung Blockkurs Java

Einführung in die Programmierung Blockkurs Java Michael Bader 19. 25. Februar 2003 Freitag Inhaltsübersicht Exceptions und Errors Ausnahmebehandlung: try/catch/finally Threads Zugriffskontrolle bei gemeinsamen Variablen: synchronized, wait(), notify()

Mehr

Nebenläufige und verteilte Programme CS2301

Nebenläufige und verteilte Programme CS2301 Nebenläufige und verteilte Programme CS2301 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Monitorprogramme: Passive Monitore und aktive Threads Monitor-Anwendungen: Spezifikation

Mehr

4.2 Programmiersprache C

4.2 Programmiersprache C 4.2.1. Elementare Datentypen (signed) int, unsigned int, (signed) short (int), unsigned short (int), (signed) long (int), unsigned long (int) Elementare Datentypen für ganze Zahlen mit oder ohne Vorzeichen.

Mehr

Nebenläufigkeit mit Java

Nebenläufigkeit mit Java Nebenläufigkeit mit Java Einheit 03: Synchronisation Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda Synchronisation von Threads Locks Java Monitor-Konzept Lock Freigabe Zusammenspiel

Mehr

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz Patrick Schulz patrick.schulz@paec-media.de 29.04.2013 1 Einführung Einführung 2 3 4 Quellen 1 Einführung Einführung 2 3 4 Quellen Hello World in Java Einführung 1 public class hello_ world 2 { 3 public

Mehr

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

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11 C++ Teil 12 Sven Groß 18. Jan 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 12 18. Jan 2016 1 / 11 Themen der letzten Vorlesung Wiederholung aller bisherigen Themen: Datentypen und Variablen Operatoren Kontrollstrukturen

Mehr

Programmieren in C++ Templates

Programmieren in C++ Templates Programmieren in C++ Templates Inhalt Templates Funktions- und Klassen-Templates Spezialisierung von Templates Generische Klassen Einbinden von Templates Instantiierung (implizit und explizit) Templates

Mehr

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Dynamische Datentypen Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen Probleme mit

Mehr

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

race conditions deadlocks Modernes C++ Sharing data between threads Adrian Ziessler 5. Juni 2012 Adrian Ziessler Modernes C++ 5. Modernes C++ Sharing data between threads Adrian Ziessler 5. Juni 2012 Adrian Ziessler Modernes C++ 5. Juni 2012 1/22 table of contents race conditions the problem and a solution further guidelines for

Mehr

C Seminar. Dr.sc.nat. Michael J.M. Wagner, New Elements. Revision 89

C Seminar. Dr.sc.nat. Michael J.M. Wagner, New Elements. Revision 89 C++11 - Seminar Dr.sc.nat. Michael J.M. Wagner, New Elements Revision 89 Inhaltsverzeichnis 1 Tour de C++ 11 1 1.1 Standards und Ziele................................ 1 1.2 Kernsprache....................................

Mehr

Datenkapselung: public / private

Datenkapselung: public / private 627 18. Klassen Klassen, Memberfunktionen, Konstruktoren, Stapel, verkettete Liste, dynamischer Speicher, Copy-Konstruktor, Zuweisungsoperator, Destruktor, Konzept Dynamischer Datentyp Datenkapselung:

Mehr

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin Fakutltät IV Technische Universität Berlin 5. Mai 2014 Inhaltsverzeichnis 1 2 3 4 5 6 7 Überblick Beispielprogramm in Java Beispielprogramm in C 1 2 3 4 5 6 7 Beispielprogramm in Java Beispielprogramm

Mehr

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Objektorientiertes Programmieren mit C++ für Fortgeschrittene BEREICH DATENTECHNIK I CQ 300 00 TH 02 Objektorientiertes Programmieren mit C++ für Fortgeschrittene Kapitel 3 3. Mehrfachvererbung 3.1. Eigenschaften und Problematik 3.2. Virtuelle Basisklassen BEREICH

Mehr

Visuelle Kryptographie. Anwendung von Zufallszahlen

Visuelle Kryptographie. Anwendung von Zufallszahlen Visuelle Kryptographie Anwendung von Zufallszahlen Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken, so dass Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken,

Mehr

Ausnahmebehandlung in Java

Ausnahmebehandlung in Java Ausnahmebehandlung in Java class A { void foo() throws Help, SyntaxError {... class B extends A { void foo() throws Help { if (helpneeded()) throw new Help();... try {... catch (Help e) {... catch (Exception

Mehr

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

C++ für alle. Praktische Neuerungen in C September 2012 Praktische Neuerungen in C++11 18. September 2012 Änderungen kriegen Klassen. Eine Änderung mit X ist Y : S syntaktisch T im Typsystem L in der Library S for-schleifen Alt und bekannt aus C++98/03: std

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 22 Einstieg in die Informatik mit Java Grundlagen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 22 1 Kommentare 2 Bezeichner für Klassen, Methoden, Variablen 3 White

Mehr

Programmier-Befehle - Woche 08

Programmier-Befehle - Woche 08 Datentypen Vektoren (mehrdim.) eines bestimmten Typs Erfordert: #include Wichtige Befehle: Definition: std::vector my vec (n rows, std::vector(n cols, init value)) Zugriff:

Mehr

Verteilte Systeme CS5001

Verteilte Systeme CS5001 Verteilte Systeme CS5001 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Client-Server-Anwendungen: Vom passiven (shared state) Monitor zum aktiven Monitor Monitor (Hoare, Brinch-Hansen,

Mehr

Praktikum aus Softwareentwicklung 2, Stunde 5

Praktikum aus Softwareentwicklung 2, Stunde 5 Praktikum aus Softwareentwicklung 2, Stunde 5 Lehrziele/Inhalt 1. Threads Threads Threads sind parallele, oder auf Rechnern mit nur einer CPU quasi-parallele, Programmabläufe in Java. Sie können beispielsweise

Mehr

Klausur Grundlagen der Programmierung

Klausur Grundlagen der Programmierung Klausur Grundlagen der Programmierung Aufgabenstellung: Martin Schultheiß Erreichte Punktzahl: von 60 Note: Allgemeine Hinweise: Schreiben Sie bitte Ihren Namen auf jedes der Blätter Zugelassene Hilfsmittel

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine

Mehr

Vorlesung Informatik II

Vorlesung Informatik II Vorlesung Informatik II Universität Augsburg Wintersemester 2011/2012 Prof. Dr. Bernhard Bauer Folien von: Prof. Dr. Robert Lorenz Lehrprofessur für Informatik 17. JAVA Kommunikation von Threads 1 Motivation

Mehr

Prozesse und Threads. wissen leben WWU Münster

Prozesse und Threads. wissen leben WWU Münster Münster Multi Threading in C++ 1 /19 Prozesse und Threads Ein Unix-Prozess hat IDs (process,user,group) Umgebungsvariablen Verzeichnis Programmcode Register, Stack, Heap Dateideskriptoren, Signale message

Mehr

7. Übung Informatik II - Objektorientierte Programmierung

7. Übung Informatik II - Objektorientierte Programmierung 7. Übung Informatik II - Objektorientierte Programmierung 29. Mai 2015 Inhalt 1 2 3 Übersicht 1 2 3 Idee Menschen nehmen die Welt in Form von Objekten wahr manche Objekte haben gleiche Eigenschaften, hierüber

Mehr

Wirtschaftsinformatik II Sommersemester Lo sungshinweise zu den Ü bungen P. Mandl, M. Dolag, B. Rottmüller, et al.

Wirtschaftsinformatik II Sommersemester Lo sungshinweise zu den Ü bungen P. Mandl, M. Dolag, B. Rottmüller, et al. Wirtschaftsinformatik II Sommersemester 2016 Lo sungshinweise zu den Ü bungen 2-6 @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 1 / 6 Übung 2 Verwendung von Java-Threads Ableitung von Klasse Thread

Mehr

boost::asio-bibliothek 238

boost::asio-bibliothek 238 boost::asio-bibliothek 238 Die von Christopher M. Kohlhoff seit 2003 entwickelte Bibliothek bietet eine für C++ geeignete Schnittstelle auf Basis der BSD-Sockets. Das bedeutet, dass prinzipiell auch alle

Mehr

17. Klassen. Datenkapselung, Klassen, Memberfunktionen, Konstruktoren

17. Klassen. Datenkapselung, Klassen, Memberfunktionen, Konstruktoren 556 17. Klassen Datenkapselung, Klassen, Memberfunktionen, Konstruktoren Ein neuer Typ mit Funktionalität... 557 struct rational { int n; int d; // INV: d!= 0 // POST: return value is the sum of a and

Mehr

Informatik B. Vorlesung 8 Synchronisierung von Threads. Dr. Ralf Kunze

Informatik B. Vorlesung 8 Synchronisierung von Threads. Dr. Ralf Kunze Vorlesung 8 Synchronisierung von Threads 1 Rückblick Threads Erzeugen, Starten und Stoppen Fehler abfangen Gemeinsamer Zugriff auf Ressourcen Kritische Blöcke (Einleitung) 2 Kritische Blöcke Kritische

Mehr

Beteiligte Typen (Auszug)

Beteiligte Typen (Auszug) Threads 1 Beteiligte Typen (Auszug) public sealed class Thread { public static Thread CurrentThread { get; public static void Sleep(int milliseconds) { public Thread(ThreadStart startmethod) { public string

Mehr

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja Aue

Mehr

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13 C++ Teil 7 Sven Groß 30. Nov 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 30. Nov 2015 1 / 13 Themen der letzten Vorlesung Zeiger, Felder (Wdh.) dynamische Speicherverwaltung Sven Groß (IGPM, RWTH Aachen)

Mehr

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen Teil 5 - Java Programmstruktur Operatoren Schlüsselwörter Datentypen 1 Kommentare in Java In Java gibt es drei Möglichkeiten zur Kommentierung: // Kommentar Alle Zeichen nach dem // werden ignoriert. für

Mehr

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14 C++ Teil 6 Sven Groß 27. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 27. Mai 2016 1 / 14 Themen der letzten Vorlesung Musterlösung A2 Wdh.: Zeiger und Felder Kopieren von Feldern Dynamische Speicherverwaltung

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf  Seite 1 von 29 Kapitel 2 Einführung in C++ Seite 1 von 29 C++ Zeichensatz - Buchstaben: a bis z und A bis Z. - Ziffern: 0 bis 9 - Sonderzeichen: ; :,. # + - * / % _ \! < > & ^ ~ ( ) { } [ ]? Seite 2 von 29 Höhere Elemente

Mehr

Übung zu Grundlagen der Betriebssysteme. 10. Übung 18.12.2012

Übung zu Grundlagen der Betriebssysteme. 10. Übung 18.12.2012 Übung zu Grundlagen der Betriebssysteme 10. Übung 18.12.2012 Aufgabe 1 a) Was versteht man unter einem kritischen Abschnitt oder kritischen Gebiet (critical area)? b) Welche Aufgabe hat ein Semaphor? c)

Mehr

Probeklausur. Klausurdeckblatt. Name der Prüfung: Objekt-orientierte Programmierung mit C++ Datum und Uhrzeit: 26. Februar 2015, Uhr

Probeklausur. Klausurdeckblatt. Name der Prüfung: Objekt-orientierte Programmierung mit C++ Datum und Uhrzeit: 26. Februar 2015, Uhr Probeklausur Klausurdeckblatt Name der Prüfung: Objekt-orientierte Programmierung mit C++ Datum und Uhrzeit: 26. Februar 2015, 14 16 Uhr Bearbeitungszeit: 120 Min. Institut: Angewandte Informati- Prüfer:

Mehr

Grundlagen der Programmierung in C Klassen

Grundlagen der Programmierung in C Klassen Grundlagen der Programmierung in C Klassen Wintersemester 2005/2006 G. Zachmann Clausthal University, Germany zach@in.tu-clausthal.de Das C++ Typsystem simple address pointer reference structured integral

Mehr

Aufgabenblatt 11 Musterlösung

Aufgabenblatt 11 Musterlösung Programmierkurs Aufgabenblatt 11 Dr. Ole Klein, Dr. Steffen Müthing Abgabe 09. Februar 2018 IWR, Universität Heidelberg ipk-exercises:2017-ws-89-g0001213 Hinweise zur Klausur: Aufgabenblatt 11 Die Klausur

Mehr

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer)

4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer) 4 Generische Programmierung 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer) (*) Auch in dieser Datei. V 4.05; Hon. Prof. Helmke 1 Intelligente Zeiger

Mehr

Metaprogrammierung 372

Metaprogrammierung 372 Metaprogrammierung 372 thales$ g++ -c -fpermissive -DLAST=30 Primes.cpp 2>&1 fgrep In instantiation Primes.cpp: In instantiation of void Prime_print::f() [with int i = 29] : Primes.cpp: In instantiation

Mehr

Unterlagen. CPP-Uebungen-08/

Unterlagen.  CPP-Uebungen-08/ Unterlagen http://projects.eml.org/bcb/people/ralph/ CPP-Uebungen-08/ http://www.katjawegner.de/lectures.html Kommentare in C++ #include /* Dies ist ein langer Kommentar, der über zwei Zeilen

Mehr

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

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes PThreads Prozesse und Threads Ein Unix-Prozess hat IDs (process,user,group) Umgebungsvariablen Verzeichnis Programmcode Register, Stack, Heap Dateideskriptoren, Signale message queues, pipes, shared memory

Mehr

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections Leibniz Universität IT Services Anja Aue Arrays... speichern mehrere Werte vom gleichen Datentyp. fassen zusammenhängende Werte

Mehr

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes Verschlüsseln eines Bildes Visuelle Kryptographie Anwendung von Zufallszahlen Wir wollen ein Bild an Alice und Bob schicken, so dass Alice allein keine Information über das Bild bekommt Bob allein keine

Mehr

Anwendung (2. Versuch:-) Entkopplung der Locks

Anwendung (2. Versuch:-) Entkopplung der Locks Gut gemeint aber leider fehlerhaft... Jeder Producer benötigt zwei Locks gleichzeitig, um zu produzieren: 1. dasjenige für den Puffer; 2. dasjenige für einen Semaphor. Musser fürden Semaphor einwait()

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java Vorlesung vom 18.4.07, Grundlagen Übersicht 1 Kommentare 2 Bezeichner für Klassen, Methoden, Variablen 3 White Space Zeichen 4 Wortsymbole 5 Interpunktionszeichen 6 Operatoren 7 import Anweisungen 8 Form

Mehr

Objektorientierung. Marc Satkowski 20. November C# Kurs

Objektorientierung. Marc Satkowski 20. November C# Kurs Objektorientierung Marc Satkowski 20. November 2016 C# Kurs Gliederung 1. Weiterführende Verzweigungen Tertiäre-Verzweigung switch case 2. Schleifen Zählschleife (for) break & continue 3. Objektorientierung

Mehr

Einführung in die Programmierung Wintersemester 2008/09

Einführung in die Programmierung Wintersemester 2008/09 Einführung in die Programmierung Wintersemester 28/9 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund : Darstellung von Information Inhalt Einfache Datentypen

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Operatoren Operatoren führen Aktionen mit Operanden aus. Der

Mehr

55 Ring-Queue. size. push. clear. get. Reinhard Schiedermeier / Klaus Köhler, Das Java-Praktikum, dpunkt.verlag, ISBN

55 Ring-Queue. size. push. clear. get. Reinhard Schiedermeier / Klaus Köhler, Das Java-Praktikum, dpunkt.verlag, ISBN D3kjd3Di38lk323nnm 394 55 Ring-Queue In dieser Aufgabe wird eine generische Containerklasse definiert. Ihre Kapazität wird beim Erzeugen festgelegt, im Gegensatz zu den Klassen des Collection- Frameworks.

Mehr

Lösung der OOP-Prüfung WS12/13

Lösung der OOP-Prüfung WS12/13 2.1.2013 Lösung der OOP-Prüfung WS12/13 1. Aufgabe a) Da der Konstruktor im protected-bereich steht, können keine eigenständigen Objekte der Klasse angelegt werden. Durch den protected-konstruktor wird

Mehr

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1] Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -108 Kapitel 5: Arrays Einführung Ein Array ist eine Reihung gleichartiger Objekte. a: a[0] a[1] a[2] a[3] a[n 1] Bezeichner a steht

Mehr

Intelligente Zeiger 283

Intelligente Zeiger 283 Intelligente Zeiger 283 smart pointer regular pointer administrative info object contents Intelligente Zeiger (smart pointers) entsprechen weitgehend normalen Zeigern, haben aber Sonderfunktionalitäten

Mehr

Die Anweisungen zweier Prozesse werden parallel bearbeitet, wenn die Anweisungen unabhängig voneinander zur gleichen Zeit ausgeführt werden.

Die Anweisungen zweier Prozesse werden parallel bearbeitet, wenn die Anweisungen unabhängig voneinander zur gleichen Zeit ausgeführt werden. 7 Parallelität und Nebenläufigkeit Mehrere Prozessen oder Threads Parallelität Die Anweisungen zweier Prozesse werden parallel bearbeitet, wenn die Anweisungen unabhängig voneinander zur gleichen Zeit

Mehr

Aufgabenblatt 7 Musterlösung

Aufgabenblatt 7 Musterlösung Prof. Dr. rer. nat. Roland Wismüller Aufgabenblatt 7 Musterlösung Vorlesung Betriebssysteme I Wintersemester 2017/18 Aufgabe 1: Steuerung eines Warenautomaten (Bearbeitung zu Hause) Anleitung wie man solche

Mehr

Multithreading, richtig gemacht? Rainer Grimm

Multithreading, richtig gemacht? Rainer Grimm Multithreading, richtig gemacht? Rainer Grimm Überblick Threads Geteilte Variablen Thread lokale Daten Bedingungsvariablen Promise und Future Speichermodell Threads Benötigt ein Arbeitspaket und startet

Mehr

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz Einführung in C++ Vererbung I Durch Vererbung können aus bereits bestehenden Klassen neue Klassen konstruiert werden. Die neue abgeleitete Klasse erbt dabei die Daten und Methoden der sog. Basisklasse.

Mehr

Vorlesungsprüfung Programmiersprache 1

Vorlesungsprüfung Programmiersprache 1 Vorlesungsprüfung Programmiersprache 1 Termin der Prüfung: 1) Di 20.03.2018 16:15 17:00 HSB 3 2) Di 15.05.2018 16:15 17:00 HSB 3 3) Di 12.06.2018 16:15 17:00 HSB 3 Stoffgebiete: 1) Ganzzahltypen: char,

Mehr

Ausnahmenbehandlungen 220

Ausnahmenbehandlungen 220 Ausnahmenbehandlungen 220 #include #include OutOfMemory.cpp using namespace std; int main() { try { int count = 0; for(;;) { char* megabyte = new char[1048576]; cout

Mehr

Dynamische Datenstrukturen in C++ 150

Dynamische Datenstrukturen in C++ 150 Dynamische Datenstrukturen in C++ 150 In allen bisherigen Beispielen belegten die Objekte entweder statischen Speicherplatz oder sie lebten auf dem Stack. Dies vermied bislang völlig den Aufwand einer

Mehr

Java I Vorlesung Nebenläufigkeit

Java I Vorlesung Nebenläufigkeit Java I Vorlesung 10 Nebenläufigkeit 28.6.2004 Threads Synchronisation Deadlocks Thread-Kommunikation Innere Klassen Anonyme Klassen Nebenläufigkeit http://java.sun.com/docs/books/tutorial/essential/threads/

Mehr

Multithreading. Paralleles Hello World. int main() { auto hello = [](auto tnum) { cout << "Thread " << tnum << " sagt Hello World\n"; };

Multithreading. Paralleles Hello World. int main() { auto hello = [](auto tnum) { cout << Thread  << tnum <<  sagt Hello World\n; }; Multithreading Unter einem Thread versteht man eine Hardware-Ausführungseinheit, die ein Programmabarbeitet. Multithreading bedeutet demnach die parallele Ausführung von Programmteilen. Bisher haben wir

Mehr

Kapitel 6. Verklemmungen (Deadlocks)

Kapitel 6. Verklemmungen (Deadlocks) Seite 1 Kapitel 6 Verklemmungen (Deadlocks) Prof. Dr. Rolf Hennicker 16.06.2016 6.1 Charakterisierung von Deadlocks Seite 2 Eine Verklemmung entsteht, wenn alle Prozesse in einem System blockiert (d.h.

Mehr

Anregungen zu Übung 2

Anregungen zu Übung 2 Anregungen zu Übung 2 Allgemeine Informatik II - SS 2007 Was sind Arrays und wie kann man sie verwenden? Ein Array ist ein spezieller Datentyp, der mehrere Werte zu einer Einheit zusammenfasst. Er ist

Mehr

Einführung zu den Klassen in C++ 107

Einführung zu den Klassen in C++ 107 Einführung zu den Klassen in C++ 107 class Counter { public: // constructors Counter() : counter{0 { Counter(int counter) : counter{counter { // accessors int get() const { return counter; // mutators

Mehr

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Typ : void* aktuelle Parameter Pointer von beliebigem Typ 2. Funktionen - Prototypvereinbarung typangabe funktionsname(parameterliste); - Funktionsdefinition typ funktionsname(parameterliste){ Anweisung - Funktionstyp -> Typ der Funktionswertes zulaessige Typangaben

Mehr

Konzepte der Programmiersprachen

Konzepte der Programmiersprachen Konzepte der Programmiersprachen Sommersemester 2010 4. Übungsblatt Besprechung am 9. Juli 2010 http://www.iste.uni-stuttgart.de/ps/lehre/ss2010/v_konzepte/ Aufgabe 4.1: Klassen in C ++ Das folgende C

Mehr

Echtzeitprogrammierung mit Ada. Frank Feinbube Seminar: Prozesssteuerung und Robotik

Echtzeitprogrammierung mit Ada. Frank Feinbube Seminar: Prozesssteuerung und Robotik Echtzeitprogrammierung mit Ada Frank Feinbube Seminar: Prozesssteuerung und Robotik Agenda 2 Einführung Geschichte Sprachfeatures Echtzeitprogrammierung Zeiten und Uhren Multitasking & Rendezvous Prioritäten

Mehr

Probeklausur. Musterlösung

Probeklausur. Musterlösung Programmierkurs Probeklausur Dr. Steffen Müthing Abgabe 08. Februar 2019 IWR, Universität Heidelberg ipk-exercises:2018-ws-55-gc187ae0 Allgemeine Hinweise: Probeklausur Dieses Übungsblatt wird nicht bewertet.

Mehr