我有一堆需要累积值的对象。它受RwLock
保护,因此我也保持其写锁定。我希望在整个过程中保持一个写锁定。
例如:
use std::sync::RwLock;
fn main() {
let locked = RwLock::new(Vec::<u32>::new());
// this is the entry point for real-world code
let mut writer = locked.write().unwrap();
// copy into 'locked' until it is full (has 4 items)
for v in 0..100 {
if writer.len() > 4 {
// discard 'writer' and 'locked', create anew
locked = RwLock::new(Vec::<u32>::new());
writer = locked.write().unwrap();
}
writer.push(v);
}
}
虽然我的示例对固定数据进行操作,因此似乎根本不需要RwLock
,但实际代码将输入“真实代码”,而不一定退出locked
的边界“满”。
如果没有借用检查器不同意,如何在需要时创建新的locked
和writer
对象?
答案 0 :(得分:2)
我同意with David Grayson,没有明显需要重新创建RwLock
。假设在填充后需要向量,请使用mem::replace
切换Vec
:
use std::sync::RwLock;
use std::mem;
fn main() {
let locked = RwLock::new(Vec::<u32>::new());
let mut writer = locked.write().unwrap();
for v in 0..100 {
if writer.len() > 4 {
let old_vec = mem::replace(&mut *writer, Vec::new());
}
writer.push(v);
}
}
如果您不需要Vec
,请拨打Vec::clear
。