아토믹 연산자를 사용하면 여러 스레드가 안전하게 동일한 변수를 읽고 변경할 수 있다.
Ordering::Relaxed는 순서 제한은 없으며 원자적 작업만 가능하다. while인자에 load메서드로 감싼 some_work메서드는 Relaxed의 영향을 받는다 (load메서드는 아토믹 변수에 저장된 값을 읽는다 즉 Relaxed로 설정한 인자 값을 읽는다)
store 메서드 인자에 Relaxed의 논리값을 true로 설정해서 load메서드를 통해 읽어들어서 백그라운드 스레드가 실행되어break 명령을 만날때까지 스레드가 계속 실행된다(store메서드는 값을 수정하더라도 독자적 참조가 아닌 공유참조를 사용한다.)
종료프로그램 코드예시
use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering::Relaxed;
use std::thread;
use std::time::Duration;
fn main() {
// 논리값을 false로 설정
static STOP: AtomicBool = AtomicBool::new(false);
let background_thread = thread::spawn(|| {
// store 메서드에서 공유참조된 논리값을 false에서 true로 설정해서 스레드를 실행시킨다.
// true로 설정한 값은 load메서드를 통해 읽어져서 스레드가 가동된다
// 백그라운드 스레드가 break를 만나 멈출때 까지 계속 작동을 한다.
while !STOP.load(Relaxed) {
some_work();
}
});
for line in std::io::stdin().lines() {
match line.unwrap().as_str() {
"help" => println!("commands: 멈출려면 stop을 입력해주세요"),
"stop" => break, // break를 통해 멈추면 백그라운드는 종료된다.
cmd => println!("unknown command:{cmd:?}"),
}
}
// store메서드는 값을 수정하면 공유참조를 사용한다
// 먼저 원자적 작업이 가능한 Relaxed 논리값을 true로 설정해 공유참조를 시킨다.
// 그러면 load 메서드를 통해 공유참조된 true값을 읽어 들어서 스레드를 가동시킨다.
STOP.store(true, Relaxed);
// join메서드를 사용하여 background_thread가 멈출때까지 기다린다.
background_thread.join().unwrap();
}
fn some_work() {
// stop을 입력하면 1초만에 전체종료가 된다.
thread::sleep(Duration::from_millis(100));
}
https://www.yes24.com/Product/Goods/124706673
https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html
'Rust' 카테고리의 다른 글
Bufreader read_line()으로 파일 한줄씩 읽고 바이트 반환, Cursor 로 Read 구현 (0) | 2024.08.16 |
---|---|
러스트로 리눅스 wc명령어 구현 (0) | 2024.08.14 |
Rust 스레드 파킹 (0) | 2024.02.04 |
Rust 스레드 조건 변수 대기와 알림 (0) | 2024.02.04 |
타입 가드 (0) | 2024.01.28 |