[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


์ฐธ์กฐ
https://users.rust-lang.org/t/channel-or-mutex/18106