본문 바로가기

Rust

Rust 스레드 조건 변수 대기와 알림

조건변수(condition variable)를 사용해 데이터에 어떤일이 발생할 때 까지 대기했다가  알림 메서드를 호출하여 하나 또는 모든 대기스레드를 깨울 수 있다.
 
예를 들어 데이터를 추가 할 때 조건변수를 사용하여 데이터가 비어 있으면 값을 추가하고 데이터가 비어 있지 않으면 wait함수를 사용해 기다렸다가 notify_one 메서드를 사용해 하나의 메서드를 깨워서 비어있지 않고 데이터 값이 있다고 알림을 해준다.

use std::collections::VecDeque;
use std::sync::Condvar;
use std::sync::Mutex;
use std::thread;
use std::time::Duration;

fn main() {
    let queue = Mutex::new(VecDeque::<i32>::new());
    // 비어있지 않는 조건을 전달하기 위한 Condvar
    let not_empty = Condvar::new();
    thread::scope(|s| {
        s.spawn(|| loop {
            let mut q = queue.lock().unwrap();
            let item = loop {
                // 비어있으면 데이터를 추가하고
                if let Some(item) = q.pop_front() {
                    break item;
                } else {
                    // 비어이지 않으면 기다림
                    q = not_empty.wait(q).unwrap();
                }
            };
            drop(q);
            dbg!(item);
            for i in 0.. {
                queue.lock().unwrap().push_back(i);
                // 기다리고 있던 하나의 스레드를 깨우면서 비어있다고 알린다.
                not_empty.notify_one();
                thread::sleep(Duration::from_secs(1));
            }
        });
    })
}

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

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

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

www.yes24.com

 

'Rust' 카테고리의 다른 글

Rust 아토믹(atomic)연산 스레드  (0) 2024.02.04
Rust 스레드 파킹  (0) 2024.02.04
타입 가드  (0) 2024.01.28
Rust Mutex 스레드  (0) 2024.01.27
자바스크립트 러스트 클로저 비교, 메모리관리  (0) 2024.01.26