2016-08-04 97 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