2016-08-04 95 views
0

我有一堆需要累积值的对象。它受到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成为“满”。

如何在需要时创建一个新的lockedwriter对象,而不需借用检查器不同意?

+0

我不明白为什么你必须放弃向量和它周围的锁。为什么不把它的大小更改为零以丢弃其中的所有数据? –

+0

我看到您的免责声明,但我仍然不明白您的计划。如果您在整个程序期间持有作者锁定,则永远无法获得读取器锁定,因此实际上没有多线程的可能性...... – Shepmaster

回答

0

我同意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

+0

'mem :: replace'被记录为不复制任何其参数,但其源代码使用[使用copy_non_overlapping](https://doc.rust-lang.org/std/ptr/fn.copy_nonoverlapping.html)。我需要这个代码来处理'Drop',但是我不知道什么时候可以这样做。我在这里创建了一个新问题。 – njaard

+1

我认为文档应该说“没有克隆”或“没有深度复制”。 'mem :: replace'调用正确使用'mem :: forget'的'mem :: swap'以防止额外的丢弃,所以你不应该有任何问题。无论如何,这个答案中的代码没有提到'不安全',所以你知道它不会有额外的下降,甚至没有看到源:) – durka42