2016-08-04 7 views
0

값을 누적해야하는 물체가있는 물통이 있습니다. 그것은 RwLock에 의해 보호 받고 있습니다. 따라서 쓰기 잠금을 유지합니다. 프로세스 기간 동안 단일 쓰기 잠금을 유지하려고합니다. 내 예를 들어 고정 데이터에 운영하고 있으므로 전혀 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); 
    } 
} 

있지만, 실제 코드는 "실제 코드"에 입력하고 경계에 반드시 종료 것 : 예를 들어

locked의 "full"이됩니다.

borrow-checker를 동의하지 않고 필요한 경우 새로운 lockedwriter 개체를 어떻게 만듭니 까?

+0

왜 주위에 벡터와 자물쇠를 버려야하는지 모르겠습니다. 왜 그 안에있는 모든 데이터를 버리기 위해 크기를 0으로 변경하지 않습니까? –

+0

귀하의 면책 조항을 볼 수는 있지만 귀하의 프로그램을 이해할 수 없습니다. 전체 프로그램의 지속 기간 동안 라이터 잠금 장치를 가지고 있으면 독자 잠금을 얻을 수 없기 때문에 다중 스레드에 대한 가능성은 없습니다. – Shepmaster

답변

0

with David Grayson에 동의합니다. RwLock을 다시 만들 필요가 없습니다. 당신이 그것을 채우고 후 벡터를 필요로 가정하면, Vec을 전환 할 mem::replace를 사용

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::clear를 호출합니다 Vec 필요가없는 경우.

+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'을 호출하므로 아무런 문제가 없어야합니다. 어쨌든이 대답의 코드는'unsafe'에 대해서는 언급하지 않으므로, 소스를 보지도 않고 추가 드롭을하지 않을 것이라는 것을 알 수 있습니다. :) – durka42

관련 문제