[Rust] threading: condvar

์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด, ์ด๊ฒŒ. ํ•ญ์ƒ ์Šค๋ ˆ๋“œ๊ฐ€ ํ’€ํƒ€์ž„์œผ๋กœ ๋Œ๊ณ  ์žˆ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ๋„ ๊ดœํžˆ ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ๋ฆฌ๋ฉด ๊ทธ๊ฒƒ๋„ ๊ทธ๊ฒƒ๋Œ€๋กœ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿด๋•Œ, ํ•„์š”ํ•  ๋•Œ๋งŒ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋ฐ”๋กœ ์กฐ๊ฑด ๋ณ€์ˆ˜(condition variable)๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฑด Mutex ๋“ฑ๊ณผ ํ•จ๊ป˜ ์—ฎ์—ฌ์„œ ์“ฐ์ด๋Š”๋ฐ, ์—ฎ์—ฌ์žˆ๋Š” Mutex์˜ ๊ฐ’์ด ์ˆ˜์ •๋˜๊ณ  notify๊ฐ€ ๋‚ ๋ผ์˜ฌ ๋•Œ๊นŒ์ง€ ๋ธ”๋Ÿญ์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์•„๋ž˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋‹ค.

use std::time::Duration;

fn main() {
    use std::sync::{Arc, Condvar, Mutex};
    use std::thread;

    // ์‹œ์ž‘ ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.
    let pair = Arc::new((Mutex::new(false), Condvar::new()));
    let pair2 = Arc::clone(&pair);

    // mutex์˜ ๊ฐ’์ด true์ธ ๋™์•ˆ์—๋งŒ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    thread::spawn(move || {
        let (lock, cvar) = &*pair2;

        loop {
            let mut available = lock.lock().unwrap();
            println!("# ์Šค๋ ˆ๋“œ ์‹คํ–‰์ค‘");

            // false๋ผ๋ฉด wait์œผ๋กœ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
            // main ์Šค๋ ˆ๋“œ์—์„œ true๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋ฉด true๊ฐ€ ๋˜์–ด ์žฌํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
            if !*available {
                available = cvar.wait(available).unwrap();
            }
        }
    });

    // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ
    let (lock, cvar) = &*pair;

    println!("์‹œ์ž‘");
    // ์Šค๋ ˆ๋“œ ํ™œ์„ฑํ™”
    {
        let mut available = lock.lock().unwrap();
        *available = true;
        cvar.notify_one();
    }
    std::thread::sleep(Duration::from_nanos(1));

    // ์Šค๋ ˆ๋“œ ๋น„ํ™œ์„ฑํ™”
    {
        let mut available = lock.lock().unwrap();
        *available = false;
    }
    println!("์ข…๋ฃŒ");
}

๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊น ๋Œ๋‹ค๊ฐ€ ๋ธ”๋Ÿญ๋  ๊ฒƒ์ด๋‹ค.


์ฐธ์กฐ
https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html
https://www.oreilly.com/library/view/rust-programming-by/9781788390637/b94b3983-429c-48ad-a6ef-7e15d664ca14.xhtml