安全Rust要求所有參考以下內容:如何告訴Rust讓我修改隱藏在RwLock後面的共享變量?
- 一個或多個引用(
&T
)的資源, - 整整一個可變引用(
&mut T
)。
我想有一個Vec
可以被多個線程讀取並且被一個寫入,但是其中只有一個應該是可能的(如語言要求)。
所以我用一個RwLock
。我需要Vec<i8>
。爲了讓它活得比的主要功能,我Box
,然後我RwLock
各地是,像這樣的:
fn main() {
println!("Hello, world!");
let mut v = vec![0, 1, 2, 3, 4, 5, 6];
let val = RwLock::new(Box::new(v));
for i in 0..10 {
thread::spawn(move || threadFunc(&val));
}
loop {
let mut VecBox = (val.write().unwrap());
let ref mut v1 = *(*VecBox);
v1.push(1);
//And be very busy.
thread::sleep(Duration::from_millis(10000));
}
}
fn threadFunc(val: &RwLock<Box<Vec<i8>>>) {
loop {
//Use Vec
let VecBox = (val.read().unwrap());
let ref v1 = *(*VecBox);
println!("{}", v1.len());
//And be very busy.
thread::sleep(Duration::from_millis(1000));
}
}
鏽拒絕編譯這個:
capture of moved value: `val`
--> src/main.rs:14:43
|
14 | thread::spawn(move || threadFunc(&val));
| ------- ^^^ value captured here after move
| |
| value moved (into closure) here
沒有螺紋:
for i in 0..10 {
threadFunc(&val);
}
它編譯。問題在於關閉。我必須「移動」它,否則Rust抱怨說它可以超過main
,我也不能克隆val
(RwLock
不執行clone()
)。
我該怎麼辦?
謝謝,雖然'drop()'變量而不是黑客範圍更習慣? –
@CharlesShiller請參見[有什麼選項可以在Rust中結束可變借入?](http://stackoverflow.com/q/35765440/1233251)。所以不,塊可以像你一樣習慣。 –
@ E_net4在這種情況下,'drop'應該可以工作,因爲鎖看起來不像可變的借位。我不知道*這兩種*在這裏都比其他地方更習慣用法; '下降(vec)'雖然看起來很奇怪。 – Shepmaster