[rust] Rust에서의 락과 뮤텍스

Rust는 안전하고 병렬성을 갖춘 프로그래밍 언어로써, 락과 뮤텍스를 사용하여 공유 자원에 안전하게 접근하는 기능을 제공합니다. 락과 뮤텍스는 멀티스레드 환경에서 데이터 무결성을 유지하기 위해 중요한 역할을 합니다.

뮤텍스(Mutex)

뮤텍스는 “상호배타적 락(Mutual Exclusion)”을 나타내는 것으로, 프로그램에서 Critical Section에 안전하게 접근하기 위해 사용됩니다. Rust에서는 std::sync::Mutex 모듈을 사용하여 뮤텍스를 생성하고 사용할 수 있습니다.

use std::sync::Mutex;

fn main() {
    let data = Mutex::new(0);

    {
        let mut val = data.lock().unwrap();
        *val = 10;
    }

    println!("Data: {:?}", data.lock().unwrap());
}

위 예제에서, data 변수는 Mutex를 사용하여 뮤텍스를 생성합니다. 그리고 lock 메서드를 호출하여 뮤텍스를 잠근 후에 데이터를 안전하게 업데이트하고 출력합니다.

락과 스레드

Rust는 내장된 std::sync::Lock을 통해 스레드 간 동기화를 제공합니다. 아래는 락을 사용하여 여러 스레드에서 안전하게 데이터에 접근하는 예제입니다.

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let data = Arc::new(Mutex::new(0));

    let mut handles = vec![];

    for _ in 0..10 {
        let data = Arc::clone(&data);
        let handle = thread::spawn(move || {
            let mut val = data.lock().unwrap();
            *val += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Data: {:?}", data.lock().unwrap());
}

위 예제에서는 Arc를 사용하여 여러 스레드에서 Mutex를 안전하게 공유하고, 각 스레드에서 lock을 통해 데이터에 안전하게 접근하여 증가시킵니다.

Rust에서는 락과 뮤텍스를 통해 안전하고 병렬화된 프로그래밍을 쉽게 구현할 수 있습니다.

참고 자료