spin

std::sync::Mutex ๋ฐ std::sync์˜ ๊ธฐํƒ€ ๋™๊ธฐํ™” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” core ๋˜๋Š” alloc์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋™๊ธฐํ™” ๋˜๋Š” interior mutability์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

spin ํฌ๋ ˆ์ดํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋™๊ธฐํ™” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋“ค์„ ์Šคํ•€๋ก์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

use spin::mutex::SpinMutex;

static counter: SpinMutex<u32> = SpinMutex::new(0);

fn main() {
    println!("count: {}", counter.lock());
    *counter.lock() += 2;
    println!("count: {}", counter.lock());
}
  • ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฝ์„ ๊ฑธ ๊ฒฝ์šฐ, ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”.
  • spin also has a ticket lock mutex implementation; equivalents of RwLock, Barrier and Once from std::sync; and Lazy for lazy initialisation.
  • once_cell ํฌ๋ ˆ์ดํŠธ์—๋Š” ์ง€์—ฐ๋œ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ํƒ€์ž…์ด ์žˆ๋Š”๋ฐ spin::once::Once์™€๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Rust ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์—๋Š” spin์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ์˜ˆ์‹œ๋Š” ์ธ๋ผ์ธ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.