[Rust] 25. 스레드 동기화
프로그래밍 언어/Rust2023. 3. 24. 00:07
스레드 동기화
메시지 패싱도 안전한 동시성 데이터 전송을 다루지만 복수개의 스레드가 동일한 메모리 영역에 접근시에 안전성을 보장하기 위해서는 스레드 동기화를 사용하게 됩니다.
뮤텍스는 상호배제 (mutual exclusion) 의 약자로 주어진 시간에 하나의 스레드만 데이터 접근을 허용하도록 합니다.
이를 위해 Lock - Unlock 기능을 사용하게 됩니다.
rust에서 뮤텍스를 사용하기 위해서는 Arc 라는 thread-safe 한 스마트 포인터를 사용해주어야 한다.
use std::sync::{Mutex, Arc};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("결과 값: {}", *data.lock().unwrap());
}
// 실행 결과
결과 값: 10
다수의 스레드에서 사용되는 공유 data 변수를 접근하기 위해서 thread-safe 한 Arc 스마트포인터를 사용하여 Mutex를 사용하여 동기화를 처리합니다. 스레드에 안전한 접근을 위해 뮤텍스를 획득한 스레드만이 data 변수를 접근 및 수정할 수 있습니다. for 문에서 생성한 스레드들은 각각 data 변수의 값을 1부터 10까지 더해주고, 메인 스레드에서 스레드가 완료될 때까지 대기한 후 결과를 출력합니다.
'프로그래밍 언어 > Rust' 카테고리의 다른 글
[Rust] 26. 싱글 스레드 웹서버 (0) | 2023.04.06 |
---|---|
[Rust] 24. 스레드 (0) | 2023.03.14 |
[Rust] 23. 파일 입출력 (0) | 2023.03.10 |
[Rust] 22. 커멘드라인 아규먼트 (0) | 2023.03.09 |
[Rust] 21. 테스트 코드 (0) | 2023.03.06 |