Erweiterbare Concurrency mit Send und Sync

Beginner

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Willkommen zu Extensible Concurrency With the Send and Sync Traits. Dieser Lab ist Teil des Rust Buchs. Du kannst deine Rust-Fähigkeiten in LabEx üben.

In diesem Lab erkunden wir die zwei Concurrency-Konzepte in Rust - die Send- und Sync-Traits, die erweiterbare Concurrency-Fähigkeiten über die Standardbibliothek hinaus bieten.


Skills Graph

Erweiterbare Concurrency mit den Send- und Sync-Traits

Interessanterweise hat die Rust-Sprache sehr wenige Concurrency-Features. Fast jede Concurrency-Funktion, über die wir bisher in diesem Kapitel gesprochen haben, war Teil der Standardbibliothek, nicht der Sprache. Ihre Optionen zur Behandlung von Concurrency sind nicht auf die Sprache oder die Standardbibliothek beschränkt; Sie können eigene Concurrency-Features schreiben oder die von anderen verwenden.

Allerdings sind zwei Concurrency-Konzepte in die Sprache eingebettet: die std::marker-Traits Send und Sync.

Erlauben der Übertragung der Eigentumsgewalt zwischen Threads mit Send

Das Send-Marker-Trait gibt an, dass die Eigentumsgewalt von Werten des Typs, der Send implementiert, zwischen Threads übertragen werden kann. Fast jeder Rust-Typ ist Send, aber es gibt einige Ausnahmen, darunter Rc<T>: Dies kann nicht Send sein, weil, wenn Sie einen Rc<T>-Wert klonen und versuchen, die Eigentumsgewalt des Klons an einen anderen Thread zu übertragen, beide Threads möglicherweise gleichzeitig die Referenzzählung aktualisieren. Aus diesem Grund ist Rc<T> für die Verwendung in einthreadigen Situationen implementiert, in denen Sie die Leistungsnachteile der Threadsicherheit vermeiden möchten.

Dadurch gewährleistet das Typsystem von Rust und die Trait-Bounds, dass Sie niemals versehentlich einen Rc<T>-Wert unsicher über Threads senden können. Als wir dies in Listing 16-14 versucht haben, haben wir den Fehler erhalten: the traitSendis not implemented forRc<Mutex<i32>{=html}>`. Als wir zu Arc<T>{=html}wechselten, dasSend` ist, hat der Code kompiliert.

Jeder Typ, der ausschließlich aus Send-Typen besteht, wird automatisch ebenfalls als Send markiert. Fast alle primitiven Typen sind Send, abgesehen von rohen Zeigern, über die wir im Kapitel 19 sprechen werden.

Erlauben des Zugangs von mehreren Threads mit Sync

Das Sync-Marker-Trait gibt an, dass es sicher ist, von mehreren Threads auf den Typ zuzugreifen, der Sync implementiert. Mit anderen Worten, ein beliebiger Typ T ist Sync, wenn &T (eine unveränderliche Referenz auf T) Send ist, was bedeutet, dass die Referenz sicher an einen anderen Thread gesendet werden kann. Ähnlich wie Send sind primitive Typen Sync, und Typen, die ausschließlich aus Typen bestehen, die Sync sind, sind ebenfalls Sync.

Der Smart-Pointer Rc<T> ist ebenfalls nicht Sync aus denselben Gründen, weshalb er auch nicht Send ist. Der Typ RefCell<T> (über den wir im Kapitel 15 gesprochen haben) und die Familie der verwandten Cell<T>-Typen sind nicht Sync. Die Implementierung der Borrow-Checking, die RefCell<T> zur Laufzeit durchführt, ist nicht threadsicher. Der Smart-Pointer Mutex<T> ist Sync und kann verwendet werden, um den Zugang mit mehreren Threads zu teilen, wie Sie in "Sharing a Mutex<T>{=html} Between Multiple Threads" gesehen haben.

Manuelles Implementieren von Send und Sync ist unsicher

Da Typen, die aus den Send- und Sync-Traits bestehen, automatisch auch Send und Sync sind, müssen wir diese Traits nicht manuell implementieren. Als Marker-Traits haben sie sogar keine Methoden, die implementiert werden müssen. Sie sind nur nützlich, um Invarianten in Bezug auf die Concurrency zu erzwingen.

Das manuelle Implementieren dieser Traits erfordert das Schreiben von unsicherem Rust-Code. Wir werden im Kapitel 19 über das Verwenden von unsicherem Rust-Code sprechen; für jetzt ist die wichtigste Information, dass das Erstellen neuer konkurrierender Typen, die nicht aus Send- und Sync-Teilen bestehen, sorgfältige Überlegungen erfordert, um die Sicherheitsgarantien zu gewährleisten. "The Rustonomicon" unter https://doc.rust-lang.org/stable/nomicon enthält weitere Informationen über diese Garantien und wie man sie gewährleistet.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab "Erweiterbare Concurrency With the Send and Sync Traits" abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.