π Atomic
Atomic β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ Π·Π° ΠΎΠ΄ΠΈΠ½ Π½Π΅Π΄Π΅Π»ΠΈΠΌΡΠΉ ΡΠ°Π³, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ ΠΈ Π³ΠΎΠ½ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π―Π²Π»ΡΡΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
π§ ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
CPU ΠΈ Kernel ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π° ΡΡΡΡ:
- ΠΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ
 ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 
LOCK XADD,CMPXCHG) - Π¨ΠΈΠ½Π½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² Cache coherence
 - ΠΠ°ΡΡΠ΅ΡΠΎΠ² ΠΏΠ°ΠΌΡΡΠΈ (memory fences) Π΄Π»Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ°
 
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ:
atomic_load,atomic_storeatomic_exchange,atomic_fetch_addcompare_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)