0Pricing
C++ Academy · Ders

Kilitsiz Kuyruk Uygulaması

Tek üreticili, tek tüketicili kilitsiz bir kuyruğun tasarımını adım adım inceleyin

Kilitsiz Kuyruk Uygulaması, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.

Kilitli Kuyruklar Neden Kullanılır

Karşılıklı dışlama kilitleri kullanan kuyruklar, yüksek çekişme altında darboğaza dönüşebilir. Kilitsiz bir kuyruk, üreticilerin ve tüketicilerin eşzamanlı olarak ilerlemesini sağlar.

SPSC ve MPMC

İki çeşidi vardır:

  • SPSC — tek üretici, tek tüketici (en basit ve en hızlı)
  • MPMC — birden çok üretici, birden çok tüketici (en genel)

Her iki ucu da denetlediğinizde doğal seçim SPSC'dir.

SPSC Halka Tamponu Taslağı

İki dizine sahip dairesel bir tampon: baş (tüketici) ve kuyruk (üretici). Her taraf kendi dizinini günceller.

template <typename T, size_t N>
class SpscQueue {
    T buffer_[N];
    std::atomic<size_t> head_{0};
    std::atomic<size_t> tail_{0};
public:
    bool push(const T& v);
    bool pop(T& v);
};

SPSC Ekleme

Üretici boş yuvaları kontrol eder, veriyi yazar ve ardından kuyruğu güncelleyerek yayımlar.

bool push(const T& v) {
    const size_t t = tail_.load(std::memory_order_relaxed);
    const size_t next = (t + 1) % N;
    if (next == head_.load(std::memory_order_acquire))
        return false;     // full
    buffer_[t] = v;
    tail_.store(next, std::memory_order_release);
    return true;
}

SPSC Çıkarma

Tüketici veri olup olmadığını kontrol eder, veriyi okur ve ardından başı güncelleyerek yayımlar.

bool pop(T& v) {
    const size_t h = head_.load(std::memory_order_relaxed);
    if (h == tail_.load(std::memory_order_acquire))
        return false;     // empty
    v = buffer_[h];
    head_.store((h + 1) % N, std::memory_order_release);
    return true;
}

Bellek Sıralaması Eşleştirmesi

tail üzerindeki serbest bırakmalı store işlemi, tüketicide tail üzerindeki edinmeli load işlemiyle senkronize olur (aynı durum tersi için de geçerlidir). Doğru sıralama olmadan veri yazma işlemleri, dizin güncellemesinden sonrasına yeniden sıralanabilir.

Önbellek Satırı Dolgusu

Yanlış paylaşımı önlemek için head_ ve tail_ değerlerini ayrı önbellek satırlarına yerleştirin (genellikle aralarında 64 bayt olacak şekilde). alignas kullanın.

alignas(64) std::atomic<size_t> head_{0};
alignas(64) std::atomic<size_t> tail_{0};

MPMC: Çok Daha Zor

Birden çok üretici veya tüketici, genellikle paylaşılan dizinler üzerinde CAS döngüleriyle ek eşgüdüm gerektirir. Çok sayıda tasarım vardır (Vyukov kuyruğu, MS kuyruğu, tehlike işaretçisi tabanlı tasarım).

Boost.Lockfree

Üretim kalitesinde kilitsiz kuyruklar yazmak zordur. Kendi kuyruğunuzu sıfırdan yazmak yerine Boost.Lockfree veya Folly’nin ProducerConsumerQueue’sini kullanın.

Ödünleşimler

Kilitsiz kuyruklar:

  • Çekişme altında daha yüksek aktarım hızı
  • Sınırlı gecikme (bir kilit için bekleme yoktur)
  • Yazılması ve hatalarının ayıklanması çok daha zordur
  • Bellek sıralaması hataları sessizce ortaya çıkar ve bulunmaları zordur

Kilitsiz Kodun Sınanması

Veri yarışlarını yakalamak için ThreadSanitizer (-fsanitize=thread) kullanın. Sıralama hatalarını ortaya çıkarmak için rastgele bekleme eklemeleri içeren zorlayıcı sınamalar kullanın.

Karşılıklı Dışlama Kilidi Ne Zaman Yeterlidir

Çoğu uygulamanın kilitsiz kuyruklara ihtiyacı yoktur. Önce ölçüm yapın — karşılıklı dışlama kilidiyle iyi uygulanmış bir kuyruk, özellikle toplu işleme kullanıldığında, çoğu zaman yeterli performansı gösterir.

Hızlı Kontrol

Yanlış paylaşım nedir ve head_ ile tail_ neden dolguyla ayrılır?

Özet

Kilitsiz bir SPSC kuyruğu, üreticinin sahibi olduğu tail ve tüketicinin sahibi olduğu head değerlerini içeren bir halka tamponu kullanır. Edinme/serbest bırakma sıralamasını kullanın ve dizinleri ayrı önbellek satırlarına yerleştirmek için dolgu ekleyin. MPMC için sınanmış bir kütüphaneyi tercih edin.

Sıkça Sorulan Sorular

“Kilitsiz Kuyruk Uygulaması” dersi ücretsiz mi?

Evet — “Kilitsiz Kuyruk Uygulaması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.

“Kilitsiz Kuyruk Uygulaması” dersinde ne öğreneceğim?

Tek üreticili, tek tüketicili kilitsiz bir kuyruğun tasarımını adım adım inceleyin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C++ Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Kilitsiz Kuyruk Uygulaması” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. std::atomic ve Bellek Sıraları
  2. Karşılaştır ve Değiştir: CAS Kalıpları
  3. Kilitsiz Kuyruk Uygulaması
  4. Tehlike İşaretçileri ve ABA Sorunu
← C++ Academy Sayfasına Dön