[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