[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