Keyboard shortcuts

Press ← or β†’ to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

spin

std::sync::Mutex ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации ΠΈΠ· std::sync нСдоступны Π² core ΠΈΠ»ΠΈ alloc. Как ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ синхронизациСй ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для совмСстного использования состояния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ЦП?

ΠšΡ€Π΅ΠΉΡ‚ spin прСдоставляСт эквивалСнты ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΈΠ· этих ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π½Π° основС спинлоков.

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

use spin::mutex::SpinMutex;

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

fn main() {
    dbg!(COUNTER.lock());
    *COUNTER.lock() += 2;
    dbg!(COUNTER.lock());
}
  • Π‘Ρ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (deadlock), Ссли Π±Π΅Ρ€Ρ‘Ρ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ.
  • spin Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° с ticket lock; эквивалСнты RwLock, Barrier ΠΈ Once ΠΈΠ· std::sync; Π° Ρ‚Π°ΠΊΠΆΠ΅ Lazy для Π»Π΅Π½ΠΈΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
  • ΠšΡ€Π΅ΠΉΡ‚ once_cell Ρ‚Π°ΠΊΠΆΠ΅ содСрТит ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ для ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ, Ρ‡Π΅ΠΌ spin::once::Once.
  • Rust Playground Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ spin, поэтому этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ прямо Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅.