CodeBlanks Logo Icon CodeBlanks

atomic flag

atomic_flag ile spinlock öğrenirsin.

atomic_flag

std::atomic_flag, en basit atomic türdür. Yalnızca iki durumu vardır: set ve clear. Tüm donanımlarda kilitsiz olmak garantidir (is_lock_free her zaman true). ATOMIC_FLAG_INIT ile clear durumunda başlatılır.

f.test_and_set() mevcut durumu döndürür ve bayrağı set yapar. f.clear() bayrağı temizler. Bu iki işlemden ötürü atomic_flag, döngü içinde bekleyen spinlock uygulamak için idealdir. Diğer atomic türlerin tersine, atomic_flag'in load veya store üyeleri yoktur.

Spinlock deseni

Bir spinlock, kilidi alana kadar döngü içinde bekleyen bir kilit türüdür. while (f.test_and_set()) { /* bekle */ } kalıbı bayrağı alana kadar döner. İş bittiğinde f.clear(); ile bırakılır. Mutex'ten farklı olarak, iş parçacığı uyumaz; sürekli döner.

Spinlock, kısa kritik bölümler için etkilidir çünkü uyku/bekleme maliyeti yoktur. Uzun kritik bölümlerde CPU'yu boş yere meşgul eder; bu yüzden mutex tercih edilir. Standart kütüphanede std::atomic_flag ile kurulan spinlock örneği, kilitsiz senkronizasyonun en temel kalıbıdır.

Uygulama atomic_flag test et

std::atomic_flag f = ATOMIC_FLAG_INIT; ile başlat. bool was_set = f.test_and_set(); ile ilk durumu al ve set yap. std::cout << was_set << " " << f.test_and_set(); yaz: önceki durum ve ikinci çağrının sonucu (artık set olduğu için 1 döner).

Başlangıç kodu

main.cpp
#include <iostream>
#include <atomic>

int main() {
    // atomic_flag başlat, test_and_set ile yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <atomic>

int main() {
    std::atomic_flag f = ATOMIC_FLAG_INIT;
    bool was_set = f.test_and_set();
    std::cout << was_set << " " << f.test_and_set();
    return 0;
}

Beklenen çıktı

0 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İfadeyi rolüne eşle

Kavram Anlamı
std::atomic_flag En basit atomic tür
f.test_and_set() Eski durumu döndür, set yap
f.clear() Bayrağı temizle
ATOMIC_FLAG_INIT Clear başlatma

2 test_and_set satırını tamamla

Soru
std::atomic_flag f = ATOMIC_FLAG_INIT;
bool was_set = f.____();
Cevap
std::atomic_flag f = ATOMIC_FLAG_INIT;
bool was_set = f.test_and_set();

Açıklama: f.test_and_set() eski durumu döndürür ve set yapar.

3 atomic_flag ile hangi kilit uygulanır?

  • Mutex
  • Recursive lock
  • Semaphore
  • Spinlock Doğru cevap

Açıklama: atomic_flag, spinlock uygulamak için idealdir.

İleri seviye bölümündeki tüm dersler