Introduction
Bienvenue dans Extensible Concurrency With the Send and Sync Traits. Ce laboratoire est une partie du Rust Book. Vous pouvez pratiquer vos compétences Rust dans LabEx.
Dans ce laboratoire, nous explorons les deux concepts de concurrence en Rust - les traits Send et Sync, qui offrent des capacités de concurrence extensibles au-delà de la bibliothèque standard.
Extensible Concurrency with the Send and Sync Traits
Intéressamment, le langage Rust a très peu de fonctionnalités de concurrence. Presque toutes les fonctionnalités de concurrence dont nous avons parlé jusqu'à présent dans ce chapitre font partie de la bibliothèque standard, et non du langage. Vos options pour gérer la concurrence ne sont pas limitées au langage ou à la bibliothèque standard ; vous pouvez écrire vos propres fonctionnalités de concurrence ou utiliser celles écrites par d'autres.
Cependant, deux concepts de concurrence sont intégrés au langage : les traits std::marker Send et Sync.
Autoriser le transfert de propriété entre les threads avec Send
Le trait marqueur Send indique que la propriété des valeurs du type implémentant Send peut être transférée entre les threads. Presque tous les types Rust sont Send, mais il existe quelques exceptions, notamment Rc<T> : celui-ci ne peut pas être Send car si vous cloniez une valeur Rc<T> et tentiez de transférer la propriété du clone vers un autre thread, les deux threads pourraient mettre à jour le compteur de références en même temps. Pour cette raison, Rc<T> est implémenté pour une utilisation dans des situations mono-thread où vous ne voulez pas payer la pénalité de performance liée à la sécurité des threads.
Par conséquent, le système de types et les bornes de traits de Rust garantissent que vous ne pouvez jamais accidentellement envoyer une valeur Rc<T> entre les threads de manière non sécurisée. Lorsque nous avons essayé de le faire dans le Listing 16-14, nous avons obtenu l'erreur the trait Send is not implemented for Rc<Mutex<i32>>. Lorsque nous sommes passés à Arc<T>, qui est Send, le code a compilé.
Tout type composé entièrement de types Send est automatiquement marqué comme Send également. Presque tous les types primitifs sont Send, à l'exception des pointeurs bruts, dont nous discuterons au chapitre 19.
Allowing Access from Multiple Threads with Sync
Le trait marqueur Sync indique qu'il est sécurisé de référencer le type implémentant Sync à partir de plusieurs threads. En d'autres termes, tout type T est Sync si &T (une référence immuable à T) est Send, ce qui signifie que la référence peut être envoyée en toute sécurité à un autre thread. De manière similaire à Send, les types primitifs sont Sync, et les types composés entièrement de types qui sont Sync le sont également.
Le pointeur intelligent Rc<T> n'est également pas Sync pour les mêmes raisons pour lesquelles il n'est pas Send. Le type RefCell<T> (dont nous avons parlé au chapitre 15) et la famille de types apparentés Cell<T> ne sont pas Sync. La vérification d'emprunt que RefCell<T> effectue à l'exécution n'est pas sécurisée pour les threads. Le pointeur intelligent Mutex<T> est Sync et peut être utilisé pour partager l'accès avec plusieurs threads, comme vous l'avez vu dans "Sharing a Mutex<T> Between Multiple Threads".
Implementing Send and Sync Manually Is Unsafe
Étant donné que les types composés des traits Send et Sync sont automatiquement également Send et Sync, nous n'avons pas besoin d'implémenter manuellement ces traits. En tant que traits marqueurs, ils n'ont même pas de méthodes à implémenter. Ils sont simplement utiles pour imposer des invariants liés à la concurrence.
L'implémentation manuelle de ces traits implique l'écriture de code Rust non sécurisé. Nous parlerons de l'utilisation de code Rust non sécurisé au chapitre 19 ; pour l'instant, l'information importante est que la construction de nouveaux types concurrents ne composés pas de parties Send et Sync nécessite une réflexion approfondie pour maintenir les garanties de sécurité. https://doc.rust-lang.org/stable/nomicon contient plus d'informations sur ces garanties et sur la manière de les maintenir.
Summary
Félicitations ! Vous avez terminé le laboratoire Extensible Concurrency With the Send and Sync Traits. Vous pouvez pratiquer d'autres laboratoires dans LabEx pour améliorer vos compétences.