공유 상태를 관리하는 구조체 내에서 Mutex 가드(Guard)를 보유한 채로 동일한 Mutex를 참조하는 메서드를 호출하여 데드락이 발생하고 있습니다.
코드:
use std::sync::{Arc, Mutex};
use std::thread;
struct State {
data: Arc<Mutex<Vec<i32>>>,
}
impl State {
fn add_and_log(&self, val: i32) {
let mut lock = self.data.lock().unwrap();
lock.push(val);
self.log_size();
}
fn log_size(&self) {
let lock = self.data.lock().unwrap();
println!("Size: {}", lock.len());
}
}
fn main() {
let state = State { data: Arc::new(Mutex::new(vec![])) };
let s_clone = Arc::new(state);
let handle = thread::spawn(move || {
s_clone.add_and_log(10);
});
handle.join().unwrap();
}
오류: 프로그램이 `log_size` 호출 시점에서 멈추며, 아무런 출력 없이 프로세스가 종료되지 않음 (Deadlock).
시도: `log_size` 내부의 lock 범위를 제한하기 위해 블록`{}`을 사용했으나, `add_and_log`에서 이미 락을 잡고 있어 동일한 현상이 반복됨.
질문: `add_and_log`처럼 락을 보유한 상태에서 내부 메서드로 제어권을 넘길 때, 중복 락 획득을 방지하기 위한 Rust의 일반적인 패턴은 무엇입니까?
댓글4
모든 이야기1465
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1465개의 이야기
내부 메서드는 락 가드를 인자로 받게 만들고 실제 락 획득은 겉에서 하는 방식으로 분리하는 게 국룰인듯함ㅋㅋ 그렇게 하면 중복 락 안 걸릴걸요.