[rust] Rust 스레드와 동시성 패턴

Rust는 안전성, 장치와 메모리 관리, 그리고 동시성에 대한 지원으로 유명합니다. 이 게시물에서는 Rust에서의 스레드 생성과 관리, 그리고 다양한 동시성 패턴에 대해 알아보겠습니다.

Rust에서의 스레드

Rust는 std::thread 모듈을 통해 스레드를 생성하고 관리합니다. 아래는 스레드를 생성하는 간단한 예제 코드입니다.

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        // 스레드에서 수행될 작업
    });

    handle.join().unwrap();
}

안전한 동시성

Rust는 안전성을 위해 데이터 경합과 데드락을 방지하는데 도움이 되는 여러 가지 기능을 제공합니다. ArcMutex를 사용하여 공유 상태에서 안전하게 데이터를 변경할 수 있습니다.

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

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

    let mut handles = vec![];

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

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

    println!("Result: {}", *counter.lock().unwrap());
}

이 예제에서 Arc는 여러 스레드에서 안전하게 공유되는 데이터를 위해 사용되었고, Mutex는 데이터에 동시 액세스를 제어하기 위해 사용되었습니다.

동시성 패턴

Rust는 채널을 이용한 메시지 패싱, Futureasync/await를 통한 비동기 프로그래밍 등 다양한 동시성 패턴을 지원합니다.

use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();

    thread::spawn(move || {
        let val = String::from("안녕하세요");
        tx.send(val).unwrap();
    });

    let received = rx.recv().unwrap();
    println!("수신: {}", received);
}

이 예제에서는 mpsc 채널을 사용하여 스레드 간에 메시지를 전달하는 방법을 보여줍니다.

Rust는 이러한 동시성 패턴들을 통해 다양한 동시성 상황에서 안전하고 효율적으로 프로그래밍할 수 있는 기능을 제공합니다.

동시성과 관련된 더 자세한 정보는 Rust 공식 문서를 참조하세요.