[rust] Rust에서의 스레드 동시성 패턴

Rust는 안전하고 고성능의 시스템 프로그래밍 언어로서, 스레드 동시성을 다루는 데 강력한 지원을 제공합니다. 이 글에서는 Rust에서 스레드를 다룰 때 자주 사용되는 일반적인 패턴들을 살펴보겠습니다.

목차

스레드 생성

Rust에서 스레드를 생성할 때는 std::thread 모듈을 사용합니다. 예를 들어, 새로운 스레드를 생성하고 실행하는 코드는 다음과 같습니다:

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        // 새로운 스레드에서 실행될 코드
    });

    handle.join().unwrap(); // 스레드 종료까지 기다림
}

스레드 간 통신

Rust에서는 std::sync 모듈을 사용하여 스레드 간에 안전하게 데이터를 공유할 수 있습니다. 예를 들어, ArcMutex를 사용해 공유 데이터에 접근하는 코드는 다음과 같습니다:

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

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

    let handles: Vec<_> = (0..10)
        .map(|_| {
            let data = Arc::clone(&data);
            thread::spawn(move || {
                let mut val = data.lock().unwrap();
                *val += 1;
            })
        })
        .collect();

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

    println!("결과: {:?}", *data.lock().unwrap());
}

동시성 제어

Rust는 std::sync 모듈을 통해 다양한 동시성 제어 기능을 제공합니다. 예를 들어, 공유 데이터에 접근하는 동안에는 Mutex를 사용하여 잠금을 걸고, 특정 시점에서 작업을 중단하고 싶을 때는 Barrier를 사용할 수 있습니다.

에러 핸들링

Rust에서는 스레드 생성 또는 동시성 코드에서 발생하는 에러를 안전하게 처리할 수 있습니다. 예외를 전파하거나 에러를 처리하는 방법에 대해 자세히 알아보세요.

Rust는 멋진 동시성 지원을 통해 안전하고 효율적인 멀티스레드 프로그래밍을 가능하게 합니다. 프로젝트에 적합한 스레드 동시성 패턴을 선택하고, 안전하고 효율적인 동시성 코드를 작성해보세요.

참고 자료