반응형
728x90
소개
Rust는 시스템 프로그래밍 언어로서, C++의 성능과 Python의 사용 편의성 사이에서 완벽한 균형을 찾으려는 목표를 가지고 있습니다. 그 중에서도 Rust의 가장 중요한 특징 중 하나는 '안전한 동시성 프로그래밍'입니다. 이 글에서는 Rust의 동시성 관련 기능과 이를 사용하여 어떻게 안전하게 코드를 작성할 수 있는지에 대해 살펴보겠습니다.
동시성과 병렬성: 이해하기
동시성(concurrency)과 병렬성(parallelism)은 프로그래밍에서 중요한 개념입니다. 동시성은 여러 작업이 시간을 공유하며 실행되는 것을 의미합니다. 이는 실제로 동시에 실행되지 않더라도 여러 작업이 동시에 진행되는 것처럼 보일 수 있습니다. 병렬성은 실제로 여러 작업이 동시에 실행되는 것을 의미합니다.
Rust의 동시성
Rust는 동시성을 무엇보다 안전하게 다루도록 설계되었습니다. Rust는 컴파일 시점에 데이터 레이스를 방지하는 유일한 모던 프로그래밍 언어 중 하나입니다.
- 스레드
- Rust에서는 std::thread 모듈을 사용하여 새로운 스레드를 생성할 수 있습니다.
- 이는 런타임에 운영 체제가 관리하는 스레드를 나타냅니다.
- Rust의 스레드는 기본적으로 '1대1' 스레딩 모델을 사용하며, 이는 각 Rust 스레드가 하나의 운영 체제 스레드에 직접 매핑된다는 것을 의미합니다.
- 다음은 Rust의 std::thread를 이용한 예제입니다.
use std::thread;
use std::time::Duration;
fn main() {
thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
}
SMALL
- 메시지 패싱
- Rust에서는 스레드 간에 데이터를 안전하게 전달하는 방법 중 하나로 메시지 패싱을 사용합니다.
- std::sync::mpsc 모듈에서 제공하는 채널을 사용하면 메시지 패싱을 구현할 수 있습니다.
- 다음은 mpsc 모듈을 사용한 예제입니다
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let val = String::from("hi");
tx.send(val).unwrap();
});
let received = rx.recv().unwrap();
println!("Got: {}", received);
}
- Mutex
- Rust에서 Mutex는 Mutual Exclusion의 약자로, 여러 스레드가 동시에 데이터에 접근하는 것을 방지하기 위해 사용하는 동기화 프리미티브입니다.
- Mutex를 사용하면 한 번에 하나의 스레드만 데이터에 접근할 수 있습니다. 이는 여러 스레드가 동시에 공유 데이터에 접근하려고 할 때 발생할 수 있는 데이터 경쟁 조건을 방지하는데 효과적입니다.
- Mutex는 다음과 같은 두 가지 주요 메서드를 제공합니다.
- lock 메서드를 호출하면 스레드는 Mutex를 소유하게 되며, 이 시점부터 다른 스레드는 해당 Mutex에 대한 lock 호출을 통해 동일한 데이터에 접근할 수 없습니다.
- 데이터에 대한 접근이 끝나면 unlock 메서드를 호출하여 Mutex를 해제해야 합니다. 이를 통해 다른 스레드가 해당 Mutex를 획득하고 데이터에 접근할 수 있게 됩니다.
- Rust에서는 std::sync::Mutex를 사용하여 Mutex를 생성하고 관리할 수 있습니다.
- 다음은 std::sync::Mutex를 이용한 예제입니다.
use std::sync::Mutex;
fn main() {
let m = Mutex::new(5);
{
let mut num = m.lock().unwrap();
*num = 6;
}
println!("m = {:?}", m);
}
마치며
Rust는 다양한 동시성 프로그래밍 기능을 안전하게 제공하며, 이를 통해 더 높은 성능의 애플리케이션을 만들 수 있습니다. 이 글을 통해 Rust의 안전한 동시성 프로그래밍에 대한 개념을 이해하는 데 도움이 되었기를 바랍니다.
반응형
'개발 > Rust' 카테고리의 다른 글
Rust의 스레딩 모델과 std::thread 알아보기 (0) | 2023.06.16 |
---|---|
Rust의 Option과 Result 열거형 (0) | 2023.05.10 |
Visual Studio Code를 이용한 Rust Debug (0) | 2023.04.29 |
[Rust] Box와 Rc의 차이점 (0) | 2023.03.31 |