C++ Academy · पाठ

Lock-free queue लागू करना

single-producer single-consumer lock-free queue के design को चरणबद्ध रूप से समझें।

पाठ 3, कुल 4 में से14 चरण

Lock-free queue लागू करना, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

लॉक-फ़्री क्यू क्यों?

म्यूटेक्स वाली क्यू अधिक विवाद की स्थिति में बाधा बन सकती हैं। लॉक-फ़्री क्यू उत्पादकों और उपभोक्ताओं को समवर्ती रूप से प्रगति करने देती है।

SPSC बनाम MPMC

दो प्रकार:

  • SPSC — एकल उत्पादक, एकल उपभोक्ता (सबसे सरल, सबसे तेज़)
  • MPMC — अनेक उत्पादक, अनेक उपभोक्ता (सबसे सामान्य)

जब दोनों सिरों पर आपका नियंत्रण हो, तब SPSC स्वाभाविक विकल्प है।

SPSC वलयाकार बफ़र का खाका

दो सूचकांकों वाला एक वृत्ताकार बफ़र: हेड (उपभोक्ता) और टेल (उत्पादक)। दोनों पक्ष अपना-अपना सूचकांक अद्यतन करते हैं।

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 में डालना

उत्पादक खाली स्थानों की जाँच करता है, डेटा लिखता है और फिर टेल को अद्यतन करके उसे प्रकाशित करता है।

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 से निकालना

उपभोक्ता डेटा की जाँच करता है, उसे पढ़ता है और फिर हेड को अद्यतन करके उसे प्रकाशित करता है।

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;
}

मेमोरी क्रम का युग्मन

टेल पर किया गया रिलीज़-स्टोर उपभोक्ता में टेल पर किए गए एक्वायर-लोड के साथ समकालित होता है (और इसके विपरीत भी)। सही क्रम के बिना, डेटा लेखन को सूचकांक अद्यतन के बाद पुनःक्रमित किया जा सकता है।

कैश पंक्ति पैडिंग

अनावश्यक साझाकरण से बचने के लिए head_ और tail_ को अलग-अलग कैश पंक्तियों पर रखें (आमतौर पर 64 बाइट की दूरी पर)। alignas का उपयोग करें।

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

MPMC: कहीं अधिक कठिन

एकाधिक उत्पादकों या उपभोक्ताओं के लिए अतिरिक्त समन्वय आवश्यक होता है — आमतौर पर साझा सूचकांकों पर CAS लूप के माध्यम से। इसके कई अभिकल्प मौजूद हैं (Vyukov queue, MS-queue, Hazard-Pointer-आधारित)।

Boost.Lockfree

उत्पादन-स्तर की लॉक-रहित क्यू बनाना कठिन है। अपनी क्यू स्वयं बनाने के बजाय Boost.Lockfree या Folly की ProducerConsumerQueue का उपयोग करें।

लाभ-हानियाँ

लॉक-रहित क्यू:

  • प्रतिस्पर्धा के दौरान अधिक प्रसंस्करण क्षमता
  • सीमित विलंबता (लॉक के लिए प्रतीक्षा नहीं करनी पड़ती)
  • लिखना और त्रुटियाँ ढूँढना बहुत कठिन
  • मेमोरी क्रम संबंधी त्रुटियाँ मौन और पकड़ना कठिन होती हैं

लॉक-रहित कोड का परीक्षण

डेटा रेस पकड़ने के लिए ThreadSanitizer (-fsanitize=thread) का उपयोग करें। क्रम संबंधी त्रुटियाँ उजागर करने के लिए यादृच्छिक विराम डालकर दबाव परीक्षण चलाएँ।

जब म्यूटेक्स पर्याप्त हो

अधिकांश अनुप्रयोगों को लॉक-रहित क्यू की आवश्यकता नहीं होती। पहले माप लें — अच्छी तरह कार्यान्वित म्यूटेक्स-संरक्षित क्यू अक्सर पर्याप्त प्रदर्शन करती है, विशेषकर बैच में प्रसंस्करण करने पर।

त्वरित जाँच

अनावश्यक साझाकरण क्या है, और head_ तथा tail_ में पैडिंग क्यों करनी चाहिए?

पुनरावलोकन

लॉक-रहित SPSC क्यू में उत्पादक के स्वामित्व वाला टेल और उपभोक्ता के स्वामित्व वाला हेड सहित एक वलयाकार बफ़र होता है। एक्वायर/रिलीज़ क्रम का उपयोग करें और सूचकांकों को अलग-अलग कैश पंक्तियों पर रखने के लिए पैडिंग करें। MPMC के लिए परखी हुई लाइब्रेरी को प्राथमिकता दें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ C++ सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “Lock-free queue लागू करना” पाठ निःशुल्क है?

हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Lock-free queue लागू करना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Lock-free queue लागू करना” में मैं क्या सीखूँगा?

single-producer single-consumer lock-free queue के design को चरणबद्ध रूप से समझें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“Lock-free queue लागू करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. std::atomic और memory orders
  2. Compare-and-swap CAS patterns
  3. Lock-free queue लागू करना
  4. Hazard pointers और ABA problem
← C++ Academy पर वापस जाएँ