πŸ“Œ 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
KernelIRQ-safe счётчики, Ρ„Π»Π°Π³ΠΈ, состояния
MultithreadingБСзопасныС Ρ„Π»Π°Π³ΠΈ, счётчики, статусы

πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ (C11 stdatomic)

#include <stdatomic.h>
atomic_int counter = 0;
 
void increment() {
  atomic_fetch_add(&counter, 1);
}

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • Высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

  • Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π±Π΅Π· нСобходимости Π² Lock

  • ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для real-time ΠΈ embedded систСм

❌ НСдостатки

  • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Π°Ρ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (слоТно Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ)

  • Ошибки приводят ΠΊ Π½Π΅ΡƒΠ»ΠΎΠ²ΠΈΠΌΡ‹ΠΌ Π±Π°Π³Π°ΠΌ

  • Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ понимания ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ памяти ΠΈ Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠ²

  • НС всСгда ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°ΠΌΠΈ (x86, ARM)