Lassen Sie uns in der Rost -Programmiersprache durch den Wald der Parallelitätsprogrammierung spazieren gehen. Denken Sie daran, dass dieser Artikel nicht als vollständig. Es dient nur als Grundlage für die Erweiterung und Erstellung komplexerer Anwendungen.
Prozesse und Fäden
Wenn wir ein normales Programm schreiben und es auf einem Zielsystem ausführen, führt das Host -Betriebssystem den Code in einem Prozess aus. Ein Prozess bezieht sich auf eine Einheit einer angegebenen ausführbaren Datei.
In modernen Systemen und Anwendungen haben Sie jedoch Teile desselben Codes gleichzeitig mit Threads ausgeführt.
In den meisten Fällen hören Sie häufig den verwendeten Begriff Multi-Threading, bei dem Parallelität auftritt. Dies liegt daran.
Nehmen wir ein grundlegendes Programm auf, um zu veranschaulichen, wie ein normales Programm funktioniert und wie die Parallelität verwendet wird, um es zu verbessern.
Betrachten Sie ein Programm mit zwei Schleifen wie gezeigt:
Verwenden Sie std :: thread;Im obigen Beispielcode haben wir zwei Schleifen, die von 0 bis 5 iterieren. In jeder Iteration schlafen wir jedoch 1000 Millisekunden.
Die Thread :: Sleep -Methode ermöglicht es uns, einen bestimmten Faden für die angegebene Dauer in den Schlaf zu setzen.
Wenn Sie den obigen Code ausführen, stellen Sie fest, dass die erste Schleife auf die zweite Schleife wartet, bevor er ausgeführt werden kann.
Dies liegt daran, dass beide Loops auf einem einzigen Thread liegen.
Wenn wir möchten, dass beide Loops gleichzeitig laufen, müssen wir sie in verschiedene Fäden einsetzen.
Rost erstellen Faden
Mit dem Thread -Modul können wir neue Threads erstellen. Es ist Teil der Standardbibliothek und bietet uns eine Reihe von Tools und Funktionen für die Arbeit mit Threads.
Wir können es mit der Anweisung importieren:
Verwenden Sie STD :: Thread;Wir brauchen auch das Dauermodul aus dem Zeit Thread. Wir können es importieren wie:
Verwenden Sie STD :: TIME :: DauerUm einen neuen Thread in Rost zu erstellen, verwenden Sie die Thread :: Spawn -Methode. Diese Methode nimmt einen Verschluss als Argument.
Der Verschluss definiert in diesem Fall den Code, der im Thread ausgeführt wird.
Die Syntax ist wie unten gezeigt:
Thread :: Spawn (|| Verschluss)Lassen Sie uns den vorherigen Code verfeinern und jedes Konstrukt in einen separaten Thread einfügen. Beispielcode ist wie gezeigt:
Verwenden Sie std :: thread;Im obigen Beispielprogramm erstellen wir einen neuen Thread mit der Thread :: Spawn -Funktion und übergeben die erste Schleife als Verschluss.
Im Hauptfaden führen wir die zweite Schleife aus. Dadurch können beide Schleifen gleichzeitig ausgeführt werden. Der obige Code sollte die Ausgabe als:
0Was passiert, wenn der Haupt -Thread vor dem Abschluss des „inneren“ Threads verlässt? Ein Beispiel ist wie unten gezeigt:
Verwenden Sie std :: thread;In diesem Beispiel dauert der Hauptfaden weniger zum Schlafen und wird daher schneller abgeschlossen, bevor der innere Thread abgeschlossen ist.
In einem solchen Fall wird der innere Thread nur ausgeführt, während der Hauptfaden ausgeführt wird. Der obige Code gibt eine unvollständige Ausgabe zurück als:
0Dies liegt daran, dass der „innere“ Thread vor Fertigstellung gekündigt wird.
Rost -Join -Griffe
Wir haben gesehen, wie sich ein Thread verhält, wenn der Hauptfaden vor dem Abschluss beendet ist. Wir können uns den beiden Griffen anschließen, um einen solchen Fall zu lösen und den anderen Thread auf einen anderen warten zu.
Mit dem Verbindungsgriff können der Hauptfaden vor der Beendigung auf die anderen Fäden warten.
Um Griffe zu verbinden, verwenden wir die Join -Methode wie in der folgenden Syntax:
Sei handle_name = thread :: spawn (closeure);Lassen Sie uns unser Schleifenbeispiel neu definieren, bei dem der Hauptfaden früh austritt.
Verwenden Sie std :: thread;Im obigen Beispielcode erstellen wir eine Handle -Variable, die den Thread enthält. Anschließend verbinden wir den Thread mit der moje () -Methode.
Die Ausweichmethode ermöglicht es uns, Fehler zu behandeln.
Da der Hauptfaden für eine kürzere Zeit schläft, sollte er vor dem „inneren“ Faden abgeschlossen sein. Es sollte jedoch darauf warten, dass der andere Thread aufgrund der Join -Methode beendet wird.
Der Ausgang ist wie gezeigt:
0Beachten Sie, dass der Hauptfaden alle Werte in kurzer Dauer ausgibt und darauf wartet, dass der andere Faden abgeschlossen ist.
Rost -Fadenschaltung Abschluss
Möglicherweise haben Sie das Keyword in Move Move in dem Thread -Verschluss in unserem vorherigen Beispiel bemerkt. Der MOVE -Verschluss wird mit der Thread :: Spawn -Methode verwendet, um die Teilen von Daten zwischen Threads zu ermöglichen.
Mit dem Schlüsselwort des Verschiebens können wir einem Thread zulassen, den Eigentum an Werten in einen anderen Thread zu übertragen.
Nehmen Sie unten ein Beispielprogramm:
Verwenden Sie std :: thread;Im obigen Code deklarieren wir ein Array namens arr im Haupt -Thread. Wir erzeugen dann einen neuen Faden ohne den Verschluss der Bewegung.
Hinweis: Da wir versuchen, auf das Array -ARR zuzugreifen und sie Teil der Schließumgebung zu machen, fällt die Zusammenstellung aus, da sie in diesem Thread nicht verfügbar ist.
Wir können das Move -Schlüsselwort verwenden, um die Schließung im Thread zu erzwingen, um das Array zu übernehmen.
Wir können den obigen Code beheben, indem wir den Move -Verschluss wie gezeigt hinzufügen:
Verwenden Sie std :: thread;Dadurch kann der Thread das Array übernehmen und es iterieren. Dies sollte zurückkehren:
1Abschluss
Das waren die Grundlagen der gleichzeitigen Programmierung in der Rost -Programmiersprache. Obwohl dieser Artikel als konkrete Grundlage für Rost -Parallelität dient, behandelt er keine fortgeschrittenen Konzepte. Sie können die Dokumentation für Details überprüfen.