atomic flag
- C++ kursu
- İleri seviye
- Ders 28/83
- 5 dk
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
#include <iostream>
#include <atomic>
int main() {
// atomic_flag başlat, test_and_set ile yazdır
return 0;
}Örnek çözüm
#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
std::atomic_flag f = ATOMIC_FLAG_INIT;
bool was_set = f.____();
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.