comnic's Dev&Life

[Rust] 11. 병행성(Concurrency)과 동시성(Parallelism) 본문

Rust

[Rust] 11. 병행성(Concurrency)과 동시성(Parallelism)

comnic 2023. 12. 9. 17:12
반응형

11. 병행성(Concurrency)과 동시성(Parallelism)

병행성은 여러 작업이 동시에 실행되는 것처럼 보이도록 하는 컴퓨터 과학의 개념입니다.  Rust에서는 스레드를 통한 병행성을 지원합니다. 각 스레드는 독립적으로 실행되며, 여러 스레드가 동시에 진행되는 것처럼 보입니다. 동시성은 물리적인 멀티코어 CPU에서 여러 작업이 실제로 동시에 실행되는 것을 의미합니다. Rust는 동시성을 지원하기 위해 여러 접근 방식을 제공합니다. 주로 벡터화, 병렬 컬렉션, 및 Rayon 라이브러리 등을 통해 병렬 처리를 지원합니다.

 

11. 1 스레드와 안전한 공유 상태

 Rust에서는 스레드를 통한 병행성을 지원하고, 안전한 공유 상태를 보장하기 위해 소유권 시스템과 트레이트를 활용합니다. 여러 스레드 간에 데이터를 공유할 때, 데이터 소유와 접근을 안전하게 하기 위해 Arc(Atomic Reference Counting)Mutex를 사용합니다.

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

fn main() {
    // 공유 상태를 가진 가변성을 보장하기 위한 Arc와 Mutex 사용
    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: Mutex는 뮤텍스를 사용하여 여러 스레드가 안전하게 공유 상태에 접근할 수 있도록 합니다.
  • thread::spawn: thread::spawn 함수를 사용하여 스레드를 생성하고, move 키워드를 통해 소유권을 전달합니다.
  • lock: lock 메소드를 사용하여 뮤텍스를 잠금(lock)하고, 잠긴 상태에서 공유 데이터에 안전하게 접근할 수 있습니다.

 

11. 2 메시지 전달을 통한 병행성

 Rust에서는 메시지 전달을 통한 병행성(Concurrency)을 지원합니다. 이는 여러 작업을 독립적으로 실행하고, 이들 간에 메시지를 주고받아 데이터를 공유하지 않는 방식입니다. Rust의 std::sync::mpsc 모듈을 사용하여 메시지 채널을 생성하고, 스레드 간에 메시지를 주고받습니다.

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

fn main() {
    // 메시지 전달을 위한 채널 생성
    let (sender, receiver) = mpsc::channel();

    for id in 0..5 {
        let sender_clone = sender.clone();
        thread::spawn(move || {
            sender_clone.send(id).unwrap();
        });
    }

    // 메시지 수신 및 출력
    for _ in 0..5 {
        let received = receiver.recv().unwrap();
        println!("Received: {}", received);
    }
}
  • mpsc::channel: mpsc 모듈의 channel 함수를 사용하여 메시지 채널을 생성합니다. sender와 receiver는 각각 전송자와 수신자를 나타냅니다.
  • clone: clone 메소드를 사용하여 여러 스레드에서도 sender를 공유합니다.
  • send: send 메소드를 사용하여 메시지를 전송합니다.
  • recv: recv 메소드를 사용하여 메시지를 수신하고, 결과를 출력합니다.

이를 통해 메시지 전달을 통한 병행성을 구현할 수 있으며, 각 스레드가 독립적으로 실행되고 메시지를 주고받습니다. 이러한 방식은 데이터를 안전하게 공유하지 않기 때문에 안정성이 보장됩니다.

반응형
Comments