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, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΡΠΌΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.