본문 바로가기

Rust

Rust 아토믹(atomic)연산 스레드

아토믹 연산자를 사용하면 여러 스레드가 안전하게 동일한 변수를 읽고 변경할 수 있다.

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));
}

 
 

stop명령어를 입력하면 1초만에 전체종료가 된다.

 
 
 
https://www.yes24.com/Product/Goods/124706673

Rust Atomics and Locks 러스트 동시성 프로그래밍 - 예스24

최고의 성능, 최적의 안전성러스트가 선도하는 동시성 프로그래밍의 미래러스트는 안전성, 우수한 성능, 간결한 문법, 비동기 프로그래밍 지원 등 현대적인 프로그래밍 환경에 최적화된 언어로

www.yes24.com

 

https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html

Ordering in std::sync::atomic - Rust

#[non_exhaustive]pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst, }Expand descriptionAtomic memory orderings Memory orderings specify the way atomic operations synchronize memory. In its weakest Ordering::Relaxed, only the memory directly tou

doc.rust-lang.org