Skip to content

Latest commit

 

History

History
155 lines (120 loc) · 4.87 KB

File metadata and controls

155 lines (120 loc) · 4.87 KB

Aufgaben

Zurück


Inhalt


Verwendete Werkzeuge

Klassen:

  • Klasse std::thread
  • Klasse std::jthread
  • Klasse std::counting_semaphore
  • Klasse std::stop_token und Methode request_stop

Aufgabe 1: Zeitvergleich std::thread und std::async

Erzeugen Sie 100.000 Threads mit std::thread und std::async. In beiden Fällen sollen die Threads einen Wert berechnen und auf eine Variable in der Umgebung (Scope) zugreifen.

Auf diese Weise soll vermieden werden, dass der Optimizer bei der Code-Generierung zu sehr Einfluss nehmen kann.

Letzten Endes soll gemessen werden, wie lange es dauert, mit std::thread oder std::async mehrere Threads zu starten und ein berechnetes Ergebnis abzuholen.

Betrachten Sie im Task Manager den jeweiligen Verbrauch an Betriebssystemresourcen.


Aufgabe 2: Mehrere Autos und ein Parkplatz

Wir betrachten eine Simulation von fahrenden Autos und einem Parkplatz. Folgende Randbedingungen sind gegeben:

  • Es fahren 6 Autos – jedes Auto wird durch ein eigenes Thread-Objekt kontrolliert bzw. verwaltet.
  • Nach ca. 5 Sekunden Fahrzeit möchten die Autos auf einem Parkplatz parken.
  • Auf dem Parkplatz können maximal nur 3 Autos parken.
  • Ein Auto parkt 3 Sekunden, danach verlässt es den Parkplatz und fährt wiederum für ca. 5 weitere Sekunden.
  • Nach 20 Sekunden soll die Simulation kontrolliert beendet werden.

Erstellen Sie eine Simulation, die durch entsprechende Ausgaben in der Konsole fahrende Autos und die Belegung des Parkplatzes erkennen lässt.

Verwenden Sie ein std::counting_semaphore-Objekt, um damit die Zufahrt zum Parkplatz zu kontrollieren.

Zusatzaufgabe:
Realisieren Sie zum Vergleich eine Parkplatz-Klasse, die die Klasse std::condition_variable verwendet.

Ausgabe

Eine mögliche Ausgabe des Programms könnte so aussehen:

[1]:    FirstParkingArea has 3 empty lots.
[1]:    Starting Simulation:
[2]:    Car 1 is driving
[3]:    Car 2 is driving
[4]:    Car 5 is driving
[5]:    Car 6 is driving
[6]:    Car 3 is driving
[7]:    Car 4 is driving
[3]:    Want to park car 2 now
[3]:    Car 2 is parking now!
[7]:    Want to park car 4 now
[7]:    Car 4 is parking now!
[3]:    Want to leave parking area with car 2
[3]:    Car2 has left parking area
[3]:    Car 2 is driving
[6]:    Want to park car 3 now
[6]:    Car 3 is parking now!
[5]:    Want to park car 6 now
[5]:    Car 6 is parking now!
[2]:    Want to park car 1 now
[4]:    Want to park car 5 now
[7]:    Want to leave parking area with car 4
[7]:    Car4 has left parking area
[2]:    Car 1 is parking now!
[7]:    Car 4 is driving
...
...
...
[1]:    Issuing Stop Requests ...
[5]:    Want to leave parking area with car 6
[5]:    Car6 has left parking area
[2]:    Car 1 is parking now!
[5]:    Car 6 finished driving!
[6]:    Want to leave parking area with car 3
[6]:    Car3 has left parking area
[6]:    Car 3 finished driving!
[4]:    Want to leave parking area with car 5
[4]:    Car5 has left parking area
[4]:    Car 5 finished driving!
[2]:    Want to leave parking area with car 1
[2]:    Car1 has left parking area
[2]:    Car 1 finished driving!
[7]:    Want to park car 4 now
[7]:    Car 4 is parking now!
[3]:    Want to park car 2 now
[3]:    Car 2 is parking now!
[7]:    Want to leave parking area with car 4
[7]:    Car4 has left parking area
[7]:    Car 4 finished driving!
[3]:    Want to leave parking area with car 2
[3]:    Car2 has left parking area
[3]:    Car 2 finished driving!
[1]:    Stopped Simulation.

Aufgabe 3: std::async: Anzahl der beteiligten Threads

Sowohl mit der Klasse std::thread als auch der freien STL Funktion std::async lassen sich Threads erzeugen. Im einem Fall sind es Objekte des Kernels, im anderen Fall stammen die Threads aus einem Thread Pool.

Schreiben Sie ein Programm, das auf beide Weisen viele Threads erzeugt. Untersuchen Sie mit der STL Funktion std::this_thread::get_id(), wieviele Threads in beiden Fällen explizit verwendet werden. Versuchen Sie zu analysieren, wieviele Threads bei Verwendung von std::async auf einem Thread Pool verwendet werden.

Auf meinem Rechner sieht eine mögliche Ausgabe des Programms so aus:

[1]:    Start:
[1]:    Number of Threads in OS Thread Pool: 97
[1]:    Number of Threads acquired from OS:  3000
[1]:    Done.

Lösungen

Exercise_01_Thread_Comparison.cpp
Exercise_02_CarParking.cpp Exercise_03_ThreadPool_NumberOfThreads.cpp


Zurück