[Concurrency] Lock: Barrier

[์›๋ณธ ๋งํฌ]

Thread๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰์‹œ๊ฐ„์ด ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๋‹ค.
๋งŒ์•ฝ ์Šค๋ ˆ๋“œ 6๊ฐœ๋ฅผ ๋™์‹œ์— ๋„์šด๋‹ค๊ณ  ํ•˜๋ฉด

์ด๋ ‡๊ฒŒ ์ œ๋ฉ‹๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์ œ๋ฉ‹๋Œ€๋กœ ์ข…๋ฃŒ๋  ๊ฒƒ์ด๋‹ค.
๋Œ€์ฒด๋กœ ์ด๋Ÿฐ ๋™์ž‘ ์ž์ฒด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋‚˜, ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„๋•Œ ๋™์‹œ์— ์‹œ์ž‘์ด ๋˜๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Barrier๋ผ๊ณ  ๋ถ€๋ฅด๋Š” Lock ํŒจํ„ด์ด๋‹ค.
์ด๊ฑด Lock์ด ํ•ด์ œ๋˜๋Š” ์ž„๊ณ„ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ , ์Šค๋ ˆ๋“œ๋“ค์ด ํŠน์ • ์ฝ”๋“œ ์ง€์ ์— ๋„๋‹ฌํ• ๋•Œ๋งˆ๋‹ค lock์„ ๊ฑด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝ”๋“œ ์ง€์ ์— ๋„๋‹ฌํ•˜๋ฉด lock์„ ํ•ด์ œํ•˜๊ณ  ๊ฑฐ์˜ ๋™์‹œ์— ์‹คํ–‰๋˜๋„๋ก ์œ ๋„ํ•œ๋‹ค.

์•„๋ž˜๋Š” Rust์—์„œ barrier๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋‹ค.
6๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋„์›Œ์„œ ๋™์‹œ์— ์‹คํ–‰๋˜๋„๋ก ์œ ๋„ํ•œ๋‹ค.

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

    let mut handles = Vec::with_capacity(6);

    // ํฌ๊ธฐ 6์งœ๋ฆฌ ๋ฐฐ๋ฆฌ์–ด
    let barrier = Arc::new(Barrier::new(6));

    // ์Šค๋ ˆ๋“œ 6๊ฐœ ๋ฐœ์ฃผ
    for _ in 0..6 {
        let barrier = Arc::clone(&barrier);

        handles.push(thread::spawn(move || {
            println!("before wait");
            barrier.wait(); // 6๊ฐœ๊ฐ€ ์ „๋ถ€ ์—ฌ๊ธฐ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
            println!("after wait");
        }));
    }

    for handle in handles {
        handle.join().unwrap();
    }
}



์ฐธ์กฐ
https://doc.rust-lang.org/std/sync/struct.Barrier.html