[rust] Rust 스레드와 동시성 패턴
Rust는 안전성, 장치와 메모리 관리, 그리고 동시성에 대한 지원으로 유명합니다. 이 게시물에서는 Rust에서의 스레드 생성과 관리, 그리고 다양한 동시성 패턴에 대해 알아보겠습니다.
Rust에서의 스레드
Rust는 std::thread
모듈을 통해 스레드를 생성하고 관리합니다. 아래는 스레드를 생성하는 간단한 예제 코드입니다.
use std::thread;
fn main() {
let handle = thread::spawn(|| {
// 스레드에서 수행될 작업
});
handle.join().unwrap();
}
안전한 동시성
Rust는 안전성을 위해 데이터 경합과 데드락을 방지하는데 도움이 되는 여러 가지 기능을 제공합니다. Arc
와 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
는 여러 스레드에서 안전하게 공유되는 데이터를 위해 사용되었고, Mutex
는 데이터에 동시 액세스를 제어하기 위해 사용되었습니다.
동시성 패턴
Rust는 채널을 이용한 메시지 패싱, Future
와 async/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 공식 문서를 참조하세요.