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.
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.
Ermöglichen der Eigentumsübertragung zwischen Threads mit Send
Das Marker-Trait Send gibt an, dass das Eigentum an Werten des Typs, der Send implementiert, zwischen Threads übertragen werden kann. Fast jeder Rust-Typ ist Send, aber es gibt einige Ausnahmen, einschließlich Rc<T>: Dieses kann nicht Send sein, denn wenn Sie einen Rc<T>-Wert klonen und versuchen, das Eigentum des Klons an einen anderen Thread zu übertragen, könnten beide Threads gleichzeitig den Referenzzähler aktualisieren. Aus diesem Grund ist Rc<T> für die Verwendung in ein-Thread-Situationen implementiert, in denen Sie keine leistungsmindernden Auswirkungen der Thread-Sicherheit in Kauf nehmen möchten.
Daher stellen Rusts Typsystem und Trait-Bounds sicher, dass Sie niemals versehentlich einen Rc<T>-Wert unsicher über Threads senden können. Als wir dies in Listing 16-14 versuchten, erhielten wir den Fehler the trait Send is not implemented for Rc<Mutex<i32>>. Als wir zu Arc<T> wechselten, das Send ist, kompilierte der Code.
Jeder Typ, der vollständig aus Send-Typen besteht, wird automatisch ebenfalls als Send markiert. Fast alle primitiven Typen sind Send, abgesehen von Raw Pointern, die wir in Kapitel 19 besprechen 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> 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.