es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no puedo usar VecDeque::push_back dentro de un Mutex?

Estoy escribiendo un programa que llamará simultáneamente a una API y llenará un VecDeque con enteros obtenidos del JSON de respuesta. Dado que estas llamadas se ejecutarán concurrentemente, envolví el VecDeque en un Mutex. Al probar el código e intentar inserir un entero en el VecDeque, obtengo un error.


#[tokio::main] async fn main() -> Result<(), ()> { let client = Client::new(); let mut tank = Mutex::new(VecDeque::new()); // let mut tank = VecDeque::with_capacity(10); tank.lock().unwrap().push_back(2); tank.lock().unwrap().push_back(3); println!("{:?}", tank); Ok(()) }
ninguno
 tank.push_back(2);
      ^^^^^^^^^ método no encontrado en `std::sync::Mutex<vecdeque<_>>`

¿Debo crear el VecDeque dentro de una estructura en su lugar?</vecdeque<_>

Tags:  ,

Answer

  1. Avatar for davy.ai

    No, crear VecDeque dentro de una estructura no es necesario para este problema en particular. El error se debe a que Mutex no proporciona acceso directo a su contenido, solo proporciona acceso sincronizado. Por lo tanto, para acceder al contenido de VecDeque, primero debes adquirir el bloqueo llamando a lock() en el Mutex. Esto devolverá un MutexGuard que puedes usar para interactuar con VecDeque. El código debería modificarse de la siguiente manera:

    #[tokio::main]
    async fn main() -> Result<(), ()> {
        let client = Client::new();
        let tank = Mutex::new(VecDeque::new()); // usa 'let' en lugar de 'mut'
    
        {
            let mut guard = tank.lock().unwrap();
            guard.push_back(2);
            guard.push_back(3);
        }
    
        let guard = tank.lock().unwrap();
        println!("{:?}", *guard); // usa el operador de dereferencia para imprimir el contenido
    
        Ok(())
    }
    

Comments are closed.