Concurrencia extensible con Send y Sync

Beginner

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Bienvenido a Extensible Concurrency With the Send and Sync Traits. Esta práctica es parte del Rust Book. Puedes practicar tus habilidades de Rust en LabEx.

En esta práctica, exploramos los dos conceptos de concurrencia en Rust: los rasgos Send y Sync, que ofrecen capacidades de concurrencia extensibles más allá de la biblioteca estándar.


Skills Graph

Concurrencia extensible con los rasgos Send y Sync

Curiosamente, el lenguaje Rust tiene muy pocos rasgos de concurrencia. Casi todas las características de concurrencia que hemos mencionado hasta ahora en este capítulo son parte de la biblioteca estándar, no del lenguaje. Sus opciones para manejar la concurrencia no se limitan al lenguaje o a la biblioteca estándar; puede escribir sus propias características de concurrencia o usar las escritas por otros.

Sin embargo, dos conceptos de concurrencia están integrados en el lenguaje: los rasgos std::marker Send y Sync.

Permitiendo la transferencia de la propiedad entre hilos con Send

El rasgo marcador Send indica que la propiedad de valores del tipo que implementa Send puede transferirse entre hilos. Casi todos los tipos de Rust son Send, pero hay algunas excepciones, incluyendo Rc<T>: esto no puede ser Send porque si clonaras un valor Rc<T> e intentaras transferir la propiedad del clon a otro hilo, ambos hilos podrían actualizar la cuenta de referencias al mismo tiempo. Por esta razón, Rc<T> se implementa para su uso en situaciones de un solo hilo donde no desees pagar la penalización de rendimiento segura para hilos.

Por lo tanto, el sistema de tipos y los límites de rasgos de Rust aseguran que nunca puedas enviar accidentalmente un valor Rc<T> entre hilos de manera no segura. Cuando intentamos hacer esto en la Lista 16-14, obtuvimos el error el rasgoSendno está implementado paraRc<Mutex<i32>{=html}>`. Cuando cambiamos a Arc<T>{=html}, que es Send`, el código se compiló.

Cualquier tipo compuesto enteramente de tipos Send también se marca automáticamente como Send. Casi todos los tipos primitivos son Send, excepto los punteros crudos, que discutiremos en el Capítulo 19.

Permitiendo el acceso desde múltiples hilos con Sync

El rasgo marcador Sync indica que es seguro que el tipo que implementa Sync sea referenciado desde múltiples hilos. En otras palabras, cualquier tipo T es Sync si &T (una referencia inmutable a T) es Send, lo que significa que la referencia se puede enviar con seguridad a otro hilo. Al igual que Send, los tipos primitivos son Sync, y los tipos compuestos enteramente de tipos que son Sync también son Sync.

El puntero inteligente Rc<T> también no es Sync por las mismas razones por las que no es Send. El tipo RefCell<T> (sobre el que hablamos en el Capítulo 15) y la familia de tipos relacionados Cell<T> no son Sync. La implementación de la verificación de préstamos que hace RefCell<T> en tiempo de ejecución no es segura para hilos. El puntero inteligente Mutex<T> es Sync y se puede usar para compartir el acceso con múltiples hilos, como viste en "Compartiendo un Mutex<T>{=html} Entre Varios Hilos".

Implementar Send y Sync manualmente es inseguro

Debido a que los tipos compuestos por los rasgos Send y Sync son automáticamente Send y Sync también, no tenemos que implementar estos rasgos manualmente. Como rasgos marcadores, ni siquiera tienen métodos que implementar. Simplemente son útiles para imponer invariantes relacionados con la concurrencia.

Implementar manualmente estos rasgos implica escribir código Rust inseguro. Hablaremos sobre el uso de código Rust inseguro en el Capítulo 19; por ahora, la información importante es que construir nuevos tipos concurrentes que no estén compuestos por partes Send y Sync requiere un pensamiento cuidadoso para mantener las garantías de seguridad. "El Rustonomicon" en https://doc.rust-lang.org/stable/nomicon tiene más información sobre estas garantías y cómo mantenerlas.

Resumen

¡Felicidades! Has completado el laboratorio de Concurrencia Extensible con los Rasgos Send y Sync. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.