[Rust] tokio: Mutex

tokio๋Š” std::sync์˜ Mutex์™€ ๋ณ„๊ฐœ๋กœ ์ž์ฒด์ ์ธ Mutex ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๋Œ€์ฒด๋กœ๋Š” ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋™์ž‘ ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋‹ค๋ฆ„์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋‹จ์€, tokio ๋ฌธ์„œ์—์„œ๋„ ๊ฐ€๊ธ‰์  std์˜ Mutex๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ํŽธ์ด๋‹ค.

๋‘˜๋‹ค ์„ž์–ด์“ฐ๋Š”๊ฑด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.




์‚ฌ์šฉ๋ฒ•

์ผ๋‹จ ์‚ฌ์šฉ๋ฒ•์€ ํ‘œ์ค€ ๋ฎคํ…์Šค์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š๋‹ค.

์ƒ์„ฑ๋ฐฉ์‹์€ ๋™์ผํ•œ๋ฐ


๋ฎคํ…์Šค ๊ฐ€๋“œ ํš๋“์— Result ๋ ˆ์ด์–ด๊ฐ€ ์—†๊ณ  await์„ ํ†ตํ•ด ๋Œ€๊ธฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ข€ ๋‹ค๋ฅด๋‹ค.

์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ ์ „์ฒด๋‹ค.

use std::sync::Arc;

use tokio::sync::Mutex;

#[tokio::main]
async fn main() {
    let _counter = Arc::new(Mutex::new(0));

    let counter = _counter.clone();
    let task1 = tokio::spawn(async move {
        for _ in 0..1000 {
            let mut counter = counter.lock().await;
            *counter += 1;
        }
    });

    let counter = _counter.clone();
    let task2 = tokio::spawn(async move {
        for _ in 0..1000 {
            let mut counter = counter.lock().await;
            *counter += 1;
        }
    });

    let (_1, _2) = tokio::join!(task1, task2);
    let counter = _counter.lock().await;
    println!("Final counter value: {}", *counter);
}




๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฐ€?

ํ‘œ์ค€ Mutex๋Š” lock์„ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ฉด ์ผ๋‹จ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฐจ๋‹จํ•œ๋‹ค. ๋ฌผ๋ก  OS ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ธ ์ฐจ๋‹จ์„ ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
tokio Mutex๋Š” lock์„ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ฉด tokio executor์—๊ฒŒ ์‹คํ–‰์„ ์–‘๋ณดํ•œ๋‹ค. FIFO ๊ธฐ๋ฐ˜์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ง€์ •๋œ๋‹ค.
os ์ˆ˜์ค€์—์„œ block ๋ฆฌ์†Œ์Šค๋ฅผ ์•„๋ผ๋Š”์ง€, tokio ์ˆ˜์ค€์—์„œ ์•„๋ผ๋Š”์ง€์˜ ์ฐจ์ด์ผ ๋ฟ์ด๋‹ค.

๊ทผ๋ฐ ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ์—์„œ๋ผ๋„ ํ‘œ์ค€ Mutex๊ฐ€ ๋น„์šฉ์ด ๋” ์ ๊ณ  ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
ํŠนํžˆ Mutex ๋‚ด๋ถ€ ๊ฐ’์ด ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์„ฑ ๊ฐ’์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ํ‘œ์ค€ Mutex๊ฐ€ ํ›จ์”ฌ ์ ํ•ฉํ•˜๋‹ค.

tokio Mutex๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ I/O ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋‹ค. ๊ทธ๋Ÿฐ ํŠน๋ณ„ํ•œ ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ‘œ์ค€ Mutex๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ tokio์—์„œ๋„ ๊ถŒํ•œ๋‹ค.




์ฐธ์กฐ
https://stackoverflow.com/questions/73840520/what-is-the-difference-between-stdsyncmutex-vs-tokiosyncmutex
https://docs.rs/tokio/latest/tokio/sync/struct.Mutex.html#which-kind-of-mutex-should-you-use