[rust] Rust 스레드의 동시성 제어

Rust는 동시성을 처리하기 위한 강력한 도구들을 제공합니다. 스레드를 이용하여 병렬로 작업을 처리할 수 있으며, 데이터를 안전하게 공유하고 조작할 수 있는 기능들을 제공합니다. 이번 블로그 포스트에서는 Rust의 스레드를 이용하여 동시성을 제어하는 방법에 대해 알아보겠습니다.

목차

  1. 스레드 생성
  2. 동기화 기본 개념
  3. Mutex를 사용한 동기화
  4. Data Race 방지를 위한 Atomic 변수

스레드 생성

Rust에서는 std::thread 모듈을 사용하여 스레드를 생성할 수 있습니다. 다음은 간단한 예제 코드입니다.

use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("Hello, world!");
    });

    handle.join().unwrap();
}

위 코드에서 thread::spawn 함수를 사용하여 새로운 스레드를 생성하고 실행할 클로저를 넘겨줍니다. handle.join을 사용하여 생성한 스레드가 종료될 때까지 기다릴 수 있습니다.

동기화 기본 개념

여러 스레드가 공유된 데이터를 변경할 때, 데이터 무결성을 보장하기 위해 동기화가 필요합니다. Rust는 여러 가지 동기화 기법을 제공하는데, 기본적으로 Mutex, Atomic 등이 있습니다.

Mutex를 사용한 동기화

Mutex는 데이터에 대한 접근을 동시에 하나의 스레드만 가능하도록 제한하는 기법입니다. 다음은 Mutex를 사용한 예제 코드입니다.

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는 여러 스레드에서 안전하게 참조할 수 있는 Arc 타입이고, Mutex를 사용하여 공유 데이터에 대한 접근을 제어합니다.

Data Race 방지를 위한 Atomic 변수

Rust는 Atomic 타입을 제공하여 데이터 경쟁을 방지할 수 있습니다. Atomic 타입을 사용하면 데이터를 안전하게 공유하고 조작할 수 있습니다.

그 밖에도 RwLock, Condvar 등 다양한 동기화 기법이 제공되며, 필요에 따라 적절한 동기화 기법을 선택하여 사용할 수 있습니다.

Rust의 동시성 관련 문서를 참조하면 더 많은 정보를 얻을 수 있습니다. (https://doc.rust-lang.org/book/ch16-00-concurrency.html)

이상으로 Rust의 스레드를 이용한 동시성 제어에 대해 알아보았습니다. 본 포스트가 도움이 되었기를 바랍니다!