打印Arc和Mutex类型

时间:2015-05-04 09:38:18

标签: rust mutex

如何打印由VecMutex封装的Arc的值?我对Rust很陌生,所以我不确定我是否正在说这个。

这是我的代码,基于文档。

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let data = Arc::new(Mutex::new(vec![104, 101, 108, 108, 111]));

    for i in 0..2 {
        let data = data.clone();
        thread::spawn(move || {
            let mut data = data.lock().unwrap();
            data[i] += 1;
        });
    }

    println!("{:?}", String::from_utf8(data).unwrap());
    thread::sleep_ms(50);
}

编译器给我的错误:

  

$ rustc datarace_fixed.rs   datarace_fixed.rs:14:37:14:41错误:不匹配的类型:    预期collections::vec::Vec<u8>,       找到alloc::arc::Arc<std::sync::mutex::Mutex<collections::vec::Vec<_>>>   (预期结构collections::vec::Vec,       找到struct alloc::arc::Arc)[E0308]   datarace_fixed.rs:14 println!(“{{?}}”,String :: from_utf8(data).unwrap());

1 个答案:

答案 0 :(得分:5)

要使用Mutex值,您必须锁定互斥锁,就像在生成的线程中一样。 (playpen):

let data = data.lock().unwrap();
println!("{:?}", String::from_utf8(data.clone()).unwrap());

请注意String::from_utf8使用向量(为了将其包装在一个字符串中而不进行额外的分配),这显然是从值vec: Vec<u8>而不是引用。由于我们尚未准备放弃对data的控制,因此在使用此方法时我们必须clone

更便宜的替代方案是使用基于切片的from_utf8版本(playpen):

let data = data.lock().unwrap();
println!("{:?}", from_utf8(&data).unwrap());