[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