[rust] Rust 언어의 동시성 프로그래밍

Rust는 안전성, 속도 및 동시성을 강조하는 시스템 프로그래밍 언어로 알려져 있습니다. 이 문서에서는 Rust 언어에서의 동시성 프로그래밍에 대해 살펴보도록 하겠습니다.

1. 동시성과 병렬성

Rust에서의 “동시성”과 “병렬성”의 개념을 이해하는 것이 중요합니다. “동시성”은 작업(task) 간의 시간적 상호작용을 의미하며, “병렬성”은 실제로 동시에 여러 작업을 실행하는 개념입니다.

Rust는 이러한 동시성 및 병렬성을 안전하게 다루기 위해서 스레드(thread) 및 메시지 패싱(message passing)을 활용합니다.

2. std::thread 라이브러리

Rust 표준 라이브러리에는 std::thread 모듈을 통해 스레드를 생성하고 조작하는 기능을 제공합니다. 아래는 스레드를 생성하고 조작하는 Rust 코드의 예시입니다:

use std::thread;

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

    handle.join().unwrap();
}

3. std::sync 라이브러리

Rust는 여러 스레드 간에 데이터를 안전하게 공유하고 동기화하기 위해 std::sync 라이브러리를 제공합니다. MutexArc와 같은 타입을 사용하여 안전한 공유 상태를 유지할 수 있습니다.

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());
}

4. async/await 문법

Rust 1.39부터는 async/await 문법을 통해 비동기 프로그래밍을 더욱 쉽게 작성할 수 있도록 지원합니다. 이를 통해 비동기 프로그래밍이 더욱 직관적이고 효율적으로 작성될 수 있게 되었습니다.

use tokio;

async fn async_function() {
    // 비동기 작업 수행
}

#[tokio::main]
async fn main() {
    let result = async_function().await;
    // 비동기 작업 결과 처리
}

Rust는 이처럼 강력한 동시성 프로그래밍 기능을 제공하며, 안전하고 효율적으로 동작하는 시스템 및 병렬 프로그램을 개발할 수 있도록 도와줍니다.

참고 자료