π Atomic
Atomic β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ Π·Π° ΠΎΠ΄ΠΈΠ½ Π½Π΅Π΄Π΅Π»ΠΈΠΌΡΠΉ ΡΠ°Π³, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ ΠΈ Π³ΠΎΠ½ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π―Π²Π»ΡΡΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
π§ ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
CPU ΠΈ Kernel ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π° ΡΡΡΡ:
- ΠΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
LOCK XADD
,CMPXCHG
) - Π¨ΠΈΠ½Π½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² Cache coherence
- ΠΠ°ΡΡΠ΅ΡΠΎΠ² ΠΏΠ°ΠΌΡΡΠΈ (memory fences) Π΄Π»Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ°
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ:
atomic_load
,atomic_store
atomic_exchange
,atomic_fetch_add
compare_and_swap
(CAS) β ΠΎΡΠ½ΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΈΡ lock-free Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ²
Π C/C++ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠ΅ΡΠ΅Π· <stdatomic.h>
ΠΈΠ»ΠΈ std::atomic
. Π Linux Kernel β atomic_t
, atomic64_t
.
βοΈ ΠΠ΄Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ
ΠΠ±Π»Π°ΡΡΡ | ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ |
---|---|
Spinlock | Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· test_and_set |
Lock-free structure | ΠΡΠ΅ΡΠ΅Π΄ΠΈ, ΡΡΠ΅ΠΊΠΈ, ΠΏΡΠ»Ρ |
Reference Counting | ΠΠΎΠ΄ΡΡΡΡ ΡΡΡΠ»ΠΎΠΊ Π±Π΅Π· Mutex |
Kernel | IRQ-safe ΡΡΡΡΡΠΈΠΊΠΈ, ΡΠ»Π°Π³ΠΈ, ΡΠΎΡΡΠΎΡΠ½ΠΈΡ |
Multithreading | ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΠ»Π°Π³ΠΈ, ΡΡΡΡΡΠΈΠΊΠΈ, ΡΡΠ°ΡΡΡΡ |
π» ΠΡΠΈΠΌΠ΅Ρ (C11 stdatomic)
#include <stdatomic.h>
atomic_int counter = 0;
void increment() {
atomic_fetch_add(&counter, 1);
}
β ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
-
ΠΡΡΠΎΠΊΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
-
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² Lock
-
ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ real-time ΠΈ embedded ΡΠΈΡΡΠ΅ΠΌ
β ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
-
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½Π°Ρ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ (ΡΠ»ΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°Π·ΠΈΡΡ ΡΠ»ΠΎΠΆΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ)
-
ΠΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ Π½Π΅ΡΠ»ΠΎΠ²ΠΈΠΌΡΠΌ Π±Π°Π³Π°ΠΌ
-
Π’ΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π±Π°ΡΡΠ΅ΡΠΎΠ²
-
ΠΠ΅ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΠΌΠΈ (x86, ARM)