면접 준비 중 동시성 제어 패턴을 복습하고 있습니다. Mutex 가드(LockGuard)의 스코프 문제로 인해 데드락이 발생하는 케이스를 구현해 보려 합니다.
코드:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
let lock = data_clone.lock().unwrap();
println!("Thread 1: locked");
let _lock2 = data_clone.lock().unwrap();
});
handle.join().unwrap();
}
오류: 프로그램이 "Thread 1: locked" 출력 이후 더 이상 진행되지 않고 무한 대기 상태(deadlock)에 빠집니다.
시도: lock 변수를 사용하지 않고 바로 호출해 보았으나, 동일한 스레드 내에서 재진입(re-entrant) 시 발생하는 문제임을 확인했습니다.
질문: 위 코드처럼 동일한 스레드에서 Mutex를 중복 잠금 했을 때 발생하는 데드락을 방지하기 위해, Rust에서는 어떤 방식으로 LockGuard의 수명을 명시적으로 제한하는 것이 가장 권장되는 관례인가요?
댓글3
모든 이야기1464
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
총 1464개의 이야기
그냥 중괄호로 감싸서 스코프 강제로 끝내는 게 제일 편함.
아니면 drop(lock) 써서 바로 날려버리셈.
그게 국룰인듯ㅋㅋ