Thinking Different




스레드 동기화

 

 메시지 패싱도 안전한 동시성 데이터 전송을 다루지만 복수개의 스레드가 동일한 메모리 영역에 접근시에 안전성을 보장하기 위해서는 스레드 동기화를 사용하게 됩니다.

 뮤텍스는 상호배제 (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