π Spinlock
Spinlock β ΠΏΡΠΎΡΡΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΈ ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΡΠΏΠΈΠ½Π»ΠΎΠΊ ΠΏΠΎΡΠΎΠΊ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ) ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΡΠΈΠΊΠ»Π΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (spin), Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ½Π°. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΊΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΠΊΡΠΈΠΉ ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΠ΅ΠΉ Π·Π° ΡΠ΅ΡΡΡΡΡ, Π³Π΄Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠΎ.
π§ ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ°Π±ΠΎΡΡ
- ΠΠΎΠΏΡΡΠΊΠ° Π·Π°Ρ Π²Π°ΡΠ°: ΠΏΠΎΡΠΎΠΊ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π°Π³Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, atomic test-and-set ΠΈΠ»ΠΈ compare-and-swap).
- Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅: Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π·Π°Π½ΡΡΠ°, ΠΏΠΎΡΠΎΠΊ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΈΠΊΠ» ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΏΠΎΠ²ΡΠΎΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠΈ Π·Π°Ρ Π²Π°ΡΠ° (ΡΠΏΠΈΠ½).
- ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅: Π²Π»Π°Π΄Π΅Π»Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ»Π°Π³, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΡΠΏΠΈΠ½Π»ΠΎΠΊ.
- ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°: Π½Π΅Ρ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ² Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π·Π°Π΄Π΅ΡΠΆΠΊΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π° ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΊΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΠΊΡΠΈΡΡ .
- ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ: ΠΏΠΎΡΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΈ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ (busy-wait).
ΠΠ»ΠΎΠΊ-ΡΡ Π΅ΠΌΠ°
flowchart TB CPU["CPU / Thread"] Spinlock["Spinlock (atomic_flag)"] Memory["Shared Memory / Resource"] CPU -->|ΠΠΎΠΏΡΡΠΊΠ° Π·Π°Ρ Π²Π°ΡΠ°| Spinlock Spinlock -- Busy wait --> CPU Spinlock -->|ΠΠΎΡΡΡΠΏ ΡΠ°Π·ΡΠ΅ΡΡΠ½| Memory CPU -->|ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ| Memory CPU -->|ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅| Spinlock style Spinlock stroke:#fff,stroke-width:5px,font-weight:bold
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
lock(spinlock)
β ΠΏΠΎΠΏΡΡΠΊΠ° Π·Π°Ρ Π²Π°ΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π·Π°ΡΠΈΠΊΠ»ΠΈΠ²Π°ΡΡΡ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ ΡΡΠ°Π½Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°.unlock(spinlock)
β ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.- Atomic primitives β ΡΠ΅ΡΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π²Π°ΠΆΠ½Π° Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π³ΠΎΠ½ΠΎΠΊ.
ΠΡΠΈΠΌΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° (ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄)
function lock(spinlock):
while atomic_test_and_set(spinlock) == LOCKED:
; // Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΆΠ΄Π΅ΠΌ (spin)
function unlock(spinlock):
atomic_clear(spinlock)
ΠΠ°ΠΆΠ½ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ
-
ΠΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ: ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°Ρ Π²Π°ΡΠ° ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ.
-
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ Π΄Π»Ρ SMP: Ρ ΠΎΡΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°ΠΌΠΈ.
-
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ²: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° βΠ³ΠΎΠ»ΠΎΠ΄Π°Π½ΠΈΡβ (starvation).
-
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΠ‘: ΡΠ΄ΡΠΎ Linux Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΏΠΈΠ½Π»ΠΎΠΊΠΈ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π² SMP.
-
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΠ°ΠΌΠΈ: ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΡΡ ΡΠΏΠΈΠ½Π»ΠΎΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΏΠ°ΡΠ·Ρ (pause/yield), ΡΠΌΠ΅Π½ΡΡΠ°Ρ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΠΊΡΡ.
βοΈ ΠΠ΄Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ
-
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π² ΡΠ΄ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌ.
-
Π ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ.
-
ΠΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ.
-
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ .
-
ΠΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΈ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°.
β ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
-
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ ΠΏΡΠΈ ΠΊΡΠ°ΡΠΊΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΠΊΡΠΈΡΡ .
-
ΠΡΠΎΡΡΠΎΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
-
Π₯ΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½Π° SMP-ΡΠΈΡΡΠ΅ΠΌΠ°Ρ .
-
ΠΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°.
-
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π±ΡΡΡΡΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΡΠ΄ΡΠ΅ ΠΠ‘.
β ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
-
ΠΠΎΡΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΈ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ.
-
ΠΠ΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ Π½Π° ΠΎΠ΄Π½ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ .
-
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ βΠ³ΠΎΠ»ΠΎΠ΄Π°Π½ΠΈΡβ ΠΏΠΎΡΠΎΠΊΠΎΠ².
-
ΠΡΡΠΎΠΊΠΎΠ΅ ΡΠ½Π΅ΡΠ³ΠΎΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
-
Π’ΡΠ΅Π±ΡΠ΅Ρ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π΄Π΅Π΄Π»ΠΎΠΊΠΎΠ².
π Π‘Π²ΡΠ·Π°Π½Π½ΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
Mutex, Semaphore, Atomic Operation, Lock-Free, Barrier, SMP, Preemption, RTOS, Linux Kernel Synchronization, Futex
Π Π΅Π·ΡΠΌΠ΅
Spinlock β Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Ρ Π°ΠΊΡΠΈΠ²Π½ΡΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΊΡΠ°ΡΠΊΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΠΊΡΠΈΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ . ΠΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½ΠΈΠ·ΠΊΠΈΠ΅ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ ΠΈ ΠΏΡΠΎΡΡΠΎΡΡ, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π°ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ. ΠΠ»ΡΡΠ΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠ΄ΡΠ°Ρ ΠΠ‘ ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°
C: ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΈΠ½Π»ΠΎΠΊ Π½Π° atomic_flag (C11)
#include <stdatomic.h>
typedef struct {
atomic_flag flag;
} spinlock_t;
void spinlock_init(spinlock_t *lock) {
atomic_flag_clear(&lock->flag);
}
void spinlock_lock(spinlock_t *lock) {
while (atomic_flag_test_and_set_explicit(&lock->flag, memory_order_acquire)) {
// active wait (spin)
}
}
void spinlock_unlock(spinlock_t *lock) {
atomic_flag_clear_explicit(&lock->flag, memory_order_release);
}
C++: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ std::atomic_flag
#include <atomic>
class SpinLock {
std::atomic_flag flag = ATOMIC_FLAG_INIT;
public:
void lock() {
while(flag.test_and_set(std::memory_order_acquire)) {
// spin
}
}
void unlock() {
flag.clear(std::memory_order_release);
}
};
ΠΡΡΠ΅ΠΌΠ±Π»Π΅Ρ x86: ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ LOCK CMPXCHG Π΄Π»Ρ Π·Π°Ρ Π²Π°ΡΠ° ΡΠΏΠΈΠ½Π»ΠΎΠΊΠ°
spin_lock:
mov eax, 0 ; ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (0 - ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ)
try_lock:
mov ebx, 1 ; Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (1 - Π·Π°Π½ΡΡΠΎ)
lock cmpxchg [lock_var], ebx
jne try_lock ; Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°Ρ
Π²Π°ΡΠΈΡΡ β ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ
ret
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ:
Linux Kernel Documentation, Intel x86 Architectures Manuals, C11 standard, C++11 std::atomic, OSDev.org, Wikipedia, βOperating Systems: Three Easy Piecesβ by Remzi & Andrea Arpaci-Dusseau.