Problema al utilizar la función RwLock::write en Rust

Publicado por Brisa
hace 6 meses

Estoy intentando utilizar la función write de RwLock en Rust, pero estoy teniendo algunos problemas. Aquí está mi código:

use std::sync::RwLock;

fn main() {
    let data = RwLock::new(0);

    let mut guard = data.write().unwrap();

    *guard += 1;
    println!("Data: {}", *guard);
}

Cuando intento compilar esto, obtengo el siguiente error:

error[E0596]: cannot borrow `data` as mutable, as it is not declared as mutable
 --> main.rs:7:18
  |
7 |     let mut guard = data.write().unwrap();
  |                  ^^^^ cannot borrow as mutable

No entiendo por qué obtengo este error, ya que he declarado guard como mutable. ¿Alguien puede ayudarme a solucionar este problema? ¿Qué estoy haciendo mal en mi código?

Rust RwLock write
Respuesta de Gordon Shumway
hace 6 meses

¡Hola Brisa!

El error que estás obteniendo no está relacionado con la mutabilidad de la variable guard, sino con la de data. En Rust, si quieres tener un bloque de datos sobre el cual puedas obtener un handle de escritura (write), debes marcar la variable que posee el RwLock como mutable. De lo contrario, Rust no te permitirá obtener un guard mutable a través del método write.

Aquí te dejo el código correcto:

use std::sync::RwLock;

fn main() {
    let mut data = RwLock::new(0); // `data` tiene que ser mutable

    let mut guard = data.write().unwrap();

    *guard += 1;
    println!("Data: {}", *guard);
}

He agregado mut después de let en la declaración de data. Con este cambio, deberías poder compilar y ejecutar tu programa sin problemas. El RwLock se utiliza para proporcionar acceso mutable a los datos de manera segura en un entorno de concurrencia, por lo que necesitas mutabilidad tanto en la estructura RwLock misma como en el guard que adquieres para modificar los datos internos.

Espero que eso aclare tus dudas. ¡Sigue adelante con Rust! Es un lenguaje bastante interesante y poderoso.