如何打印Vec由a Mutex和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);
}
Run Code Online (Sandbox Code Playgroud)
编译器给我的错误:
$ rustc datarace_fixed.rs datarace_fixed.rs:14:37:14:41错误:不匹配类型:expected
collections::vec::Vec<u8>,foundalloc::arc::Arc<std::sync::mutex::Mutex<collections::vec::Vec<_>>>(期望structcollections::vec::Vec,found structalloc::arc::Arc)[E0308] datarace_fixed.rs:14 println!("{:?}",String :: from_utf8(数据).unwrap());
要使用Mutex值,您必须锁定互斥锁,就像在生成的线程中一样.(围栏):
let data = data.lock().unwrap();
println!("{:?}", String::from_utf8(data.clone()).unwrap());
Run Code Online (Sandbox Code Playgroud)
请注意,String :: from_utf8使用向量(为了将其包装在一个没有额外分配的字符串中),这显然是从它获取值vec: Vec<u8>而不是引用.由于我们还没有准备放弃我们的控制data,clone因此在使用这种方法时我们必须这样做.
更便宜的选择将是使用的基于切片的版本from_utf8(围栏):
let data = data.lock().unwrap();
println!("{:?}", from_utf8(&data).unwrap());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |