Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++: Multithreading

std::packaged_task

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Dank std::packaged_task lassen sich einfache Wrapper um aufrufbare Einheiten erzeugen, die später ausgeführt werden.
06:18

Transkript

In dieser Lektion möchte ich Ihnen std::packaged_task vorstellen. std::packaged_task ist eine weitere Umsetzung des Future-Promise Konzepts in C++11. Was ist der Anwendungsbereich von std::packaged_task? std::packaged_task erlaubt es Ihnen, einen einfachen Wrapper um eine aufrufbare Einheit zu erzeugen, so dass diese später ausgeführt werden kann. Das möchte ich Ihnen gern am konkreten Beispiel näher bringen. Zuerst verpacken Sie die Aufgabe, die Sie ausführen wollen. Dann lassen Sie sich einen Future erzeugen. Der Promise führt dann die Berechnung aus. Und der Future holt das Ergebnis ab. Diese drei Schritte sind notwendig. Wie schaut das konkret aus. Das ist Arbeitspacket, das der Promise zu erledigen hat. Er hat zwei Werte a und b, braucht zwei Argumente a und b, und addiert sie. Zuerst gilt es die Aufgabe zu verpacken. Das ist packaged_task, sumT. Und sumT bekommt das Argument add. add ist eben die Funktion von hier oben. Das schaut vielleicht ein bisschen eignerig aus. Das beschreibt die Signatur der Funktion add. Zwei int gehen rein, ein int geht raus. Dann nehme ich diesen Packaged Task und erzeuge daraus den Future, durch sumT.get_future(). Dann habe ich an der linken Seite den Future. Und das int hier steht für den Rückgabewert des Promise. Das ist alles ausgedrückt, den Wert, den der Future bekommt. Im nächsten Schritt, führe ich den Promise aus, indem ich ihm in sumT zwei Argumente gebe. Und dann fängt der Future das Ergebnis des Promise ab. Die entscheidende Idee ist, dass der Future und der Promise nicht in dem gleichen Thread laufen müssen, sondern dass Sie den Promise oder den Future oder beide in einen anderen Thread verschieben können. Ich sage hier explizit verschieben. Promise und Future können nur verschoben werden. Unter der Decke müssen Sie Move-Semantik anwenden. Das Beispiel zeige ich Ihnen noch in der Anwendung. Und los geht es mit der Anwendung. Ich habe das mal für vier Threads parallelisiert. Zuerst das Arbeitspacket, das jeder Thread zu erledigen hat. Das Arbeitspacket ist in diesem Fall das Funktionsobjekt, das die Zahlen von begin bis end aufsummiert. Und das ist das Ergebnis, das die Summe zur Verfügung stellt. End gehört nicht dazu. Und damit komme ich schon zum Hauptprogramm. Das Hauptprogramm besteht aus 1,2,3,4 Funktionsobjekten. Der Grund ist ganz einfach. Ich habe das Programm für vier Cores ausgelegt. Oder auch für vier Threads. Dann beginne ich schon die Tasks zu definieren. Die Tasks 1 bis 4 definiere ich, indem ich ihnen das Funktionsobjekt zuweise. Wenn Sie sich wundern, was das hier bedeuten soll, das ist die Signatur des Funktionsobjektes. sumUp, wenn ich ein bisschen höher scrolle, sumUp erwartet zwei int-Werte, int-int, und gibt int zurück, int. Gut, wie geht es weiter? Nun, verwende ich meine packaged_tasks, um mir die Futures zu erzeugen. Das ist hier der Datenkanal, zu dem ich den Promise und den Future benötige. Jetzt habe ich 1,2,3,4 Futures. Jeder Future, ich habe hier mal den Typ explizit ausgeschrieben, bekommt als Ergebnis int-Value. Das gebe ich auch hier an. Nun geht es weiter. Nun verschiebe ich alle meine packaged_tasks, um sie nachher angenehm starten zu können, in einer std::deque. Das sind Container der std::template Library. deque bekommt als Argumenttyp packaged_task. Und nun verschiebe ich packaged_tasks 1,2,3 und 4 in deque rein. Wieso muss ich die verschieben? Ganz einfach, Sie können packaged_tasks nicht kopieren. Sie können Sie nur verschieben. Formal ausgedrückt, packaged_tasks unterstützt nur die Move-Semantik, und technisch ist es dadurch erledigt, dass der Copy-Konstuktor und der Copy-Zuweisungsoperator des packaged_tasks auf delete gesetzt ist. Weiter im Text. Hier machen wir ein bisschen Buchhaltung. Was ich hier mache, ist einfach nur, dass ich definiere den größten Bereich, den jedes Funktionsobjekt zusammenaddieren soll. Jedes Funktionsobjekt soll 2500 Zahlen addieren. Und jetzt geht eigentlich die richtige Arbeit los. Hier iteriere ich über deque allTasks Schlange, die nicht empty ist. Und was mache ich? Ich schnappe mir das erste packaged Task aus meiner allTasks, und schiebe die Package Task in einen anderen Thread. Das mache ich genau hier. Zusätzlich bekommt der Thread noch begin und end. Das ist der Bereich, den mein Funktionsobjekt addieren soll. Dann passe ich die Indexe ein bisschen an, starte diesen Thread im Hintergrund. Und das war es. Meine packaged_tasks laufen jetzt. Jetzt muss ich nur noch die Ergebnisse mit den Futuren abholen. Future 1,2,3,4. Damit habe ich alle Zwischenergebnisse, die addiere ich zusammen, und das ist das gesamte Ergebnis. Und wenn ich jetzt das laufen lasse, dann sehen Sie, dass das Gesamtergebnis der Zahl von 0 bis 10000.. Die Zahl ist 50005000, wenn ich das richtig gelesen habe. In dieser Lektion habe ich Ihnen packaged_tasks genau vorgestellt. Packaged Tasks sind ideal, um Aufgaben in Subaufgaben aufzusplittern, sie auf einen std::deque zu schieben, und dann die Ergebnisse alle wieder einzusammeln.

C++: Multithreading

Lernen Sie die High-Level Threading-Schnittstelle in C++ kennenb und nutzen, die Sie in Form von Threads, Tasks, Locks und Bedingungsvariablen zur Anwendung bringen.

2 Std. 40 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:16.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!