std::atomic और memory orders
सही परिणाम और गति के लिए उपयुक्त memory ordering के साथ std::atomic का उपयोग करें।
std::atomic और memory orders, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
म्यूटेक्स से आगे
लॉक पहुँच को क्रमबद्ध करते हैं — वे सरल और सही होते हैं, लेकिन प्रसंस्करण क्षमता सीमित करते हैं। std::atomic उच्च-प्रसंस्करण-क्षमता वाले समवर्ती कोड के लिए लॉक-फ़्री आधारभूत घटक प्रदान करता है।
std::atomic का परिचय
std::atomic<T> किसी मान को आवृत करता है और परमाणु पठन-परिवर्तन-लेखन ऑपरेशन का समर्थन करता है।
#include <atomic>
std::atomic<int> counter{0};
counter.fetch_add(1); // atomic increment
int v = counter.load();
counter.store(0);सुविधाजनक ऑपरेटर
अंकगणितीय प्रकारों के लिए सामान्य ऑपरेटर परमाणु होते हैं।
std::atomic<int> n{0};
++n; // atomic increment
n += 5; // atomic add
int v = n; // atomic loadपरमाणु ऑपरेशन कठिन क्यों हैं
CPU कोर के बीच मेमोरी ऑपरेशन का क्रम बदल सकता है। मेमोरी क्रम निर्दिष्ट करता है कि कौन-से क्रम-परिवर्तन अनुमत हैं।
मेमोरी क्रम
पाँच सामान्य क्रम:
memory_order_relaxed— परमाणु, लेकिन कोई क्रम-निर्धारण नहींmemory_order_acquire— release के साथ जोड़ा जाता है; इसके बाद कोई क्रम-परिवर्तन नहींmemory_order_release— acquire के साथ जोड़ा जाता है; इससे पहले कोई क्रम-परिवर्तन नहींmemory_order_acq_rel— दोनोंmemory_order_seq_cst— क्रमिक रूप से सुसंगत (डिफ़ॉल्ट)
क्रमिक सुसंगतता: सुरक्षित डिफ़ॉल्ट
डिफ़ॉल्ट seq_cst सहज रूप से काम करता है — सभी परमाणु ऑपरेशन एक ही वैश्विक क्रम में निष्पादित होते हुए दिखाई देते हैं। यह relaxed क्रमों से धीमा है, लेकिन इसके तर्क को समझना आसान है।
Acquire-Release युग्मन
उत्पादक में release और उपभोक्ता में acquire का उपयोग कीजिए। acquire के बाद, मेल खाते release से पहले किए गए सभी लेखन दिखाई देते हैं।
std::atomic<bool> ready{false};
int data = 0;
// producer
data = 42;
ready.store(true, std::memory_order_release);
// consumer
while (!ready.load(std::memory_order_acquire));
std::cout << data; // sees 42Relaxed क्रम
Relaxed परमाणु ऑपरेशन परमाणुता सुनिश्चित करते हैं (कोई खंडित पठन नहीं), लेकिन किसी भी क्रम-परिवर्तन की अनुमति देते हैं। इनका उपयोग सरल काउंटर के लिए कीजिए, जहाँ क्रम मायने नहीं रखता।
तुलना और अदला-बदली
अधिकांश लॉक-फ़्री एल्गोरिदम का आधार। compare_exchange_strong(expected, desired) तभी परमाणु रूप से अपडेट करता है जब वर्तमान मान expected के बराबर हो।
std::atomic<int> a{10};
int expected = 10;
bool ok = a.compare_exchange_strong(expected, 20);
// if true, a is now 20; otherwise expected holds the actual current valueकमज़ोर बनाम मज़बूत CAS
compare_exchange_weak मानों के मेल खाने पर भी आकस्मिक रूप से विफल हो सकता है। इसका उपयोग लूप के भीतर कीजिए (कुछ प्लेटफ़ॉर्म पर यह अधिक तेज़ होता है); लूप के बाहर strong का उपयोग कीजिए।
लॉक-फ़्री बनाम प्रतीक्षा-फ़्री
प्रगति की दो गारंटियाँ:
- लॉक-फ़्री — किसी भी समय कम-से-कम एक थ्रेड प्रगति करता है
- प्रतीक्षा-फ़्री — प्रत्येक थ्रेड सीमित समय में प्रगति करता है
परमाणु ऑपरेशन का उपयोग कब करें
परमाणु ऑपरेशन हमेशा म्यूटेक्स से तेज़ नहीं होते। इनका उपयोग तब कीजिए जब आप महत्वपूर्ण पथ को सरल रख सकें — काउंटर, फ़्लैग और सरल स्थिति के लिए। जटिल साझा स्थिति के लिए म्यूटेक्स आमतौर पर अधिक सुरक्षित और स्पष्ट होते हैं।
त्वरित जाँच
किस मेमोरी क्रम की गारंटियाँ सबसे मज़बूत हैं, लेकिन वह सबसे धीमा भी है?
पुनरावलोकन
std::atomic स्पष्ट मेमोरी क्रम-निर्धारण के साथ लॉक-फ़्री प्रिमिटिव प्रदान करता है। डिफ़ॉल्ट रूप से memory_order_seq_cst का उपयोग कीजिए; उत्पादक-उपभोक्ता पैटर्न के लिए acquire/release युग्मों का उपयोग कीजिए; और relaxed का उपयोग केवल काउंटर जैसे बिना क्रम वाले परमाणु ऑपरेशन के लिए कीजिए।
एआई शिक्षक के साथ C++ सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “std::atomic और memory orders” पाठ निःशुल्क है?
हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “std::atomic और memory orders” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“std::atomic और memory orders” में मैं क्या सीखूँगा?
सही परिणाम और गति के लिए उपयुक्त memory ordering के साथ std::atomic का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“std::atomic और memory orders” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- std::atomic और memory orders
- Compare-and-swap CAS patterns
- Lock-free queue लागू करना
- Hazard pointers और ABA problem