Würde die aufgabenbasierte Programmierung in C ++ neue Sprachstandardfunktionen erfordern?


8

Also habe ich dieses Video auf Youtube mit all diesen C ++ - Mastern auf GoingNative 2012 gesehen: Interaktives Panel, in dem jeder die Fragen stellen konnte.

Dies ist das Video, über das ich gesprochen habe: GoingNative 2012 - Tag 1 - Interaktives Panel: Die Wichtigkeit, einheimisch zu sein

Und um 0:24:00 stellte jemand eine sehr interessante Frage:

Wir programmieren seit einiger Zeit gleichzeitig mit Pthreads, Windows-Threads usw. und ich bin so froh, dass C ++ und C die gleichzeitige Programmierung eingeholt haben, aber es scheint mir, dass sie bereits um fünf oder zehn Jahre zurückliegt Jahre, weil wir jetzt alle diese leistungsstarken Multicores haben und die Programmierung dieser Multicores wirklich nicht auf Threads basieren sollte, sondern aufgabenbasiert sein sollte [...] und Microsoft die PPL-Bibliothek hat und so weiter und das ist total spiegelt sich nicht im C ++ - Standard wider. [...] Das einzige, wovor ich Angst habe, ist, dass der Standard in Threads eingeschlossen sein könnte und es sehr schwierig macht, zur aufgabenbasierten Programmierung überzugehen ...

Jetzt bin ich ziemlich neu in diesen Konzepten und ein wenig verwirrt. Was ist eigentlich Aufgabe-basierte Programmierung . Bezieht sich dieser Begriff auf dasselbe, worauf sich Lock-Free Programming bezieht? Gibt es diese beiden gleichwertigen Begriffe oder gibt es Verbindungen zwischen ihnen?


1
Ich hatte noch keine Gelegenheit, mit dem neuesten C ++ - Standard zu arbeiten, daher könnte dies weit entfernt sein, entspricht jedoch den Bedenken in Ihrem Angebot. In meinem Wortschatz entspricht eine Aufgabe einem Prozess. Einem Prozess / einer Aufgabe ist ein eigener Speicher zugeordnet. Verschiedene Prozesse können nicht auf den Speicher / die Daten eines anderen Prozesses zugreifen (zumindest ohne durch die Rahmen zu springen). Ein Thread kann auf Speicher / Daten anderer Threads zugreifen, die im selben Prozess ausgeführt werden. Somit können in einem Multicore-System Prozesse ohne Probleme auf separaten CPUs ausgeführt werden, aber Threads müssten beim Zugriff auf gemeinsam genutzte Daten / Speicher miteinander koordiniert werden.
Dunk

1
... wodurch die Notwendigkeit entsteht, in einem Multicore-System durch Reifen zu springen, wenn die Threads auf verschiedenen CPUs ausgeführt werden. Dies ist schwer genug mit einem Programmierer in der Schleife zu tun. Es ist zweifelhaft, ob die Hardware / der Compiler in der Lage sein wird, den generischen Fall zuverlässig und effizient zu behandeln.
Dunk

Vielen Dank für all diese netten Antworten, aber es gibt immer noch eine unbeantwortete Frage: Does this term refer to the same thing that Lock-Free Programming refers to? Are these two equivalent terms or are there any links between them?Kann jemand erklären? Sind all diese aufgabenbasierten Bibliotheken auch auf Threads aufgebaut oder wurden sie auf andere Weise implementiert? Vielen Dank!

Antworten:


4

Microsoft hat die "Task Parallel Library" oder TPL.

Es ist eine übergeordnete Abstraktion über Threads und bibliotheksbasiert. Daher sehe ich keinen Grund, warum etwas Ähnliches in C ++ nicht erstellt werden konnte, da die TPL bereits threadbasiert ist und nicht von speziellen Funktionen in der Sprachstandard für seine Implementierung (obwohl die Schlüsselwörter asyncund awaitdem C # -Compiler hinzugefügt wurden, um eine solche Programmierung zu vereinfachen).

Eine Aufgabe in der Microsoft-Ökostruktur entspricht mehr oder weniger einer Zukunft oder einem Versprechen . Grundsätzlich handelt es sich um eine nicht blockierende (asynchrone) Funktion. Wenn Sie es aufrufen, gibt es die Kontrolle an Sie zurück, während es in einem neuen Thread ausgeführt wird, und Sie rufen den Rückgabewert zu einem späteren Zeitpunkt ab, wenn er verfügbar ist.

Die TPL verfügt über andere Funktionen Parallel.For, mit denen Sie eine Schleife gleichzeitig mit mehreren Threads verarbeiten können. All diese Dinge könnten in C ++ als Bibliotheksfunktionen implementiert werden. Tatsächlich wurde eine solche Bibliothek bereits geschrieben .

Soweit ich weiß, hängt die PPL (Parallel Patterns Library für Microsoft C ++) nicht von speziellen Sprachfunktionen ab.


Ein wichtiger Unterschied zwischen a Taskund a Threadbesteht darin, dass eine Aufgabe nicht unbedingt eine Funktion darstellt, die in einem anderen Thread ausgeführt wird. Es stellt alles dar, was beendet oder ein Wert generiert werden könnte, ohne auf dem aktuellen Thread ausgeführt zu werden. Es kann das Ergebnis sein, dass überhaupt kein Thread ausgeführt wird, wenn er keine CPU-gebundene Arbeit darstellt. Das wahrscheinlich häufigste Beispiel ist asynchrone E / A. Es stellt nicht dar, wann eine Funktion in einem anderen Thread endet. Es stellt dar, wann ein bestimmter Betriebssystem-Hook ausgelöst wird. TaskEs ist Ihnen egal, wie es abgeschlossen ist, und Sie können es als "jede asynchrone Operation" behandeln.
Servy

Ich kann in einem Kommentar kein gutes Beispiel zeigen ... grr. Ich werde sehen, ob ich eine alte Frage von mir finden kann ...
Servy

1
@Servy: Richtig; Der Abschluss einer asynchronen Operation kann das Ergebnis eines Methodenrückrufs als Reaktion auf ein externes Ereignis sein.
Robert Harvey

Ja, das ist ein Beispiel. Es ist im Allgemeinen einfach, etwas mit a einzurichten TaskCompletionSource. Die Idee ist, dass Sie eine Aufgabe erstellen und dann weiter ausführen. Dieser Thread führt schließlich etwas aus, das das Ergebnis des TCS festlegt, sodass die Aufgabe vollständig ausgeführt wird, ohne dass mehr als ein Thread ausgeführt werden muss.
Servy

0

In cpp gibt es seit Ewigkeiten Threads-via-Blocks-Bibliotheken. Es gibt Intels Thread-Bausteine , die ziemlich gut sind, und es gibt ähnliche Dinge wie OpenMP , mit denen Sie das Threading auf eine Art und Weise abstrahieren können, die das System für Sie erledigt (dies wird von VC ++ unterstützt, Sie müssen das / einstellen openmp flag in deinen Builds)

Microsoft arbeitet auch an Casablanca , das möglicherweise keine wirklich generische Aufgabenbibliothek ist, sondern ein Framework zum Schreiben von aufgabenbasierten Systemen (hauptsächlich für Web-App-Zwecke) unter Verwendung eines ähnlichen Modells wie Erlang

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.