Locks 106. der Mutex wird noch nicht belegt es wird nicht-blockierend versucht, den Mutex zu belegen. std::defer_lock std::try_to_lock
|
|
- Juliane Adenauer
- vor 5 Jahren
- Abrufe
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 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
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]
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
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
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
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
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
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(
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
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
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
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
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
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
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
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:
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
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
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
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
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
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
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
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
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
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
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()
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
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.
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
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
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
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
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
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
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....................................
Datenkapselung: public / private
627 18. Klassen Klassen, Memberfunktionen, Konstruktoren, Stapel, verkettete Liste, dynamischer Speicher, Copy-Konstruktor, Zuweisungsoperator, Destruktor, Konzept Dynamischer Datentyp Datenkapselung:
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
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
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,
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
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
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
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:
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,
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
Ü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)
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:
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
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
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
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
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
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
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
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
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()
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
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
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
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
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.
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
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
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
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
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
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
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.
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,
Ausnahmenbehandlungen 220
Ausnahmenbehandlungen 220 #include #include OutOfMemory.cpp using namespace std; int main() { try { int count = 0; for(;;) { char* megabyte = new char[1048576]; cout
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
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/
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
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.
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
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
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
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
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
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.