본문으로 바로가기
COMMUNITY모든 이야기

공유 상태를 관리하는 구조체 내에서 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의 일반적인 패턴은 무엇입니까?

모든 이야기1465

가벼운 안부부터 깊은 생각까지, 함께 나눠요.

글쓰기
총 1465개의 이야기
댓글