[Concurrency] Lock: ์ฑ๋ (channel)
์ฑ๋์ ์ผ๋ฐฉ์ ์ธ ๋ฐ์ดํฐ์ ํ๋ฆ์ ํํํ๊ธฐ์ ์ ํฉํ Lock ๋งค์ปค๋์ฆ ์ค ํ๋๋ค.
๋ด๋ถ์ ์ผ๋ก๋ Mutex๋ ์ธ๋งํฌ์ด๋ฅผ ์ด์ฉํด์ ๊ตฌํ๋๊ณค ํ๋ค. ๊ทธ๋์ ์ฌ์ค Mutex์ ๊ณ ์์ค ์ถ์ํ๋ผ๊ณ ํ ์๋ ์๋ค. (๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋)
์ฑ๋์ ์ข
๋ฅ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํํ๋ multi producer single consumer(mpsc)๋ค.
์ฌ๋ฌ๊ฐ์ ํ๋ก๋์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ณ , ํ๋์ ์ปจ์๋จธ๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค ๋ฐ์ ์ ์๋ ๊ฒ์ด๋ค.
์ด๊ฑธ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด ์ด๋ ๋ค.
sender๋ค์ ์ธ์ ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ณ , ๊ทธ๊ฑด ํญ์ ์ฑ๋์ ํ์ ํํ๋ก ์ ์ฅ์ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ receiver๋ ํ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๊บผ๋ด์ ์ฌ์ฉํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
ํ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ๋ค์ด์ฌ๋๊น์ง ๋๊ธฐํ๋ค.
์ฅ๋จ์
Mutex ๋ฑ์ ์ฌํ Lock ๊ตฌํ๋ค๊ณผ ๋น๊ตํ๋ฉด ์ฌ์ฉ๋ฒ์ด ์ง๊ด์ ์ด๊ณ ๋จ์ํ๋ค๋ ๊ฒ์ด ์ฅ์ ์ด๋ค. ์ผ๋ฐ์ ์ธ Lock์ ์ธ ๋ ํํ ๊ฒช์ ์ ์๋ ๋ฐ๋๋ฝ ๋ฑ์ ๋ฌธ์ ๊ฐ ํ์ ํ ์ ๋ค.
ํนํ Actor Model ๋ฑ์ ๊ตฌํํ๊ธฐ์ ์ฉ์ดํ๋ค.
read ์ ๋๋น write ์์ด ๊ต์ฅํ ๋ง์ ๊ฒฝ์ฐ์๋ ์ ๋ฆฌํ ํธ์ด๋ค. ๋น์ฅ ๋ค ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋๋ผ๋ ํ์ ํํ๋ก ์ผ๋จ ๋ค ๋ฐ๊ณ ๋ณด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ Mutex๋ง์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ๋จ์ด์ง ์๋ ์๋ค.
์ฌ์ฉ๋ก (Rust)
Rust์์ ๊ฐ๋จํ ์ฑ๋ ๊ธฐ๋ฐ์ ping-pong ํ๋ก๊ทธ๋จ์ ๊ตฌํํ ์๋ค.
๋จผ์ ์ปจ์๋จธ๊ฐ ์ ๋ฌ๋ฐ์ ์ด๋ฒคํธ์ ํํ๋ฅผ ์ ์ํ๋ค.

๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ์ฑ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ฌ๊ธฐ์๋ sender์ receiver๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค.
sender๋ฅผ producuer๊ฐ ๋๋ ์ ๊ฐ์ง๋ฉด ๋๊ณ , receiver๋ ๋จ์ผ consumer๋ง ๊ฐ์ง ์ ์๋ค.
๊ทธ๋ผ ์ด์ ์ ๊ฑธ ๊ฐ์ ธ๋ค๊ฐ ๋๊ธฐํ๋ฅผ ํ ์ ์๋ค.
๋ค์์ sender๊ฐ ์ ๋ฌํ๋ ๋ช
๋ น์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์์ด์ ์ถ๋ ฅํ๊ณ ๋ฆฌ์๋ฒ๋ฅผ ์ข
๋ฃํ๋ ๋ก์ง์ ๊ตฌํํ๋ค.

๊ทธ๋ผ ๊ธฐ๋ํ๋๋ก ์คํ๋ ๊ฒ์ด๋ค.

์ ์ฒด ์ฝ๋๋ค.
use tokio::sync::mpsc;
enum Event {
Message(String),
Terminate,
}
#[tokio::main]
async fn main() {
let (sender, mut receiver) = mpsc::channel(100);
// receiver
tokio::spawn(async move {
loop {
let event = receiver.recv().await.unwrap();
match event {
Event::Message(msg) => {
println!("message: {}", msg);
}
Event::Terminate => {
println!("terminate");
break;
}
}
}
});
// sender
tokio::spawn(async move {
sender.send(Event::Message("hello".to_string())).await;
sender.send(Event::Message("world".to_string())).await;
sender.send(Event::Terminate).await;
});
loop {}
}๊ด๋ จ ํฌ์คํธ
https://blog.naver.com/sssang97/223124061290