Hacker News

एसटीडी को समझना: C++17 से Shared_mutex

जानें कि कैसे C++17 से std::shared_mutex कुशल रीडर-राइटर लॉकिंग को सक्षम बनाता है, विशेष लेखन पहुंच सुनिश्चित करते हुए कई समवर्ती पढ़ने की अनुमति देता है।

9 मिनट पढ़ा

Mewayz Team

Editorial Team

Hacker News

C++17 से std::shared_mutex को समझना

std::shared_mutex, C++17 में पेश किया गया, एक सिंक्रोनाइज़ेशन प्रिमिटिव है जो लिखने के संचालन के लिए विशेष पहुंच सुनिश्चित करते हुए कई थ्रेड्स को एक साथ साझा (रीड) लॉक रखने की अनुमति देता है। यह डेवलपर्स को तीसरे पक्ष के पुस्तकालयों या प्लेटफ़ॉर्म-विशिष्ट एपीआई तक पहुंचने के बिना रीडर-राइटर लॉकिंग को लागू करने का एक साफ, मानक तरीका प्रदान करके आधुनिक C++ में सबसे आम समवर्ती चुनौतियों में से एक को हल करता है।

वास्तव में std::shared_mutex क्या है और इसे C++17 में क्यों जोड़ा गया?

C++17 से पहले, जिन डेवलपर्स को पाठक-लेखक शब्दार्थ की आवश्यकता होती थी, उन्हें POSIX सिस्टम पर pthread_rwlock_t या विंडोज़ पर SRWLOCK जैसे प्लेटफ़ॉर्म-विशिष्ट समाधानों पर निर्भर रहना पड़ता था, या वे बूस्ट जैसी तृतीय-पक्ष लाइब्रेरी का उपयोग करते थे। C++17 मानक समिति ने इस अंतर को पहचाना और इसे सीधे संबोधित करने के लिए हेडर में std::shared_mutex पेश किया।

मूल विचार सीधा है: कई वास्तविक दुनिया के कार्यक्रमों में, डेटा को लिखे जाने की तुलना में कहीं अधिक बार पढ़ा जाता है। एक मानक std::mutex सभी पहुंच को क्रमबद्ध करता है - इसमें शामिल पठन - जो अनावश्यक अड़चनें पैदा करता है। std::shared_mutex दो लॉकिंग मोड के बीच अंतर करके उस प्रतिबंध को हटा देता है:

साझा (पढ़ें) लॉक - लॉक_शेयर्ड() के माध्यम से प्राप्त किया गया; एकाधिक थ्रेड इसे एक साथ पकड़ सकते हैं, जो इसे समवर्ती पढ़ने के लिए आदर्श बनाता है।

विशिष्ट (लिखें) लॉक - लॉक() के माध्यम से प्राप्त किया गया; एक समय में केवल एक ही थ्रेड इसे धारण कर सकता है, और इसे धारण करते समय किसी भी साझा ताले की अनुमति नहीं है।

std::shared_lock - एक RAII रैपर जो निर्माण पर Lock_shared() को कॉल करता है और विनाश पर unlock_shared() को कॉल करता है, संसाधन लीक को रोकता है।

std::unique_lock / std::lock_guard - विशेष मोड के साथ उपयोग किया जाता है, यह सुनिश्चित करते हुए कि लेखन संचालन पूरी तरह से संरक्षित और अपवाद-सुरक्षित है।

यह डुअल-मोड डिज़ाइन std::shared_mutex को कैश, कॉन्फ़िगरेशन रजिस्ट्रियों और किसी भी डेटा संरचना जैसे परिदृश्यों के लिए स्वाभाविक रूप से फिट बनाता है जहां रीड्स कार्यभार पर हावी होते हैं।

आप टिप्पणियों के साथ वास्तविक कोड में std::shared_mutex का उपयोग कैसे करते हैं?

std::shared_mutex का उपयोग करने वाले कोड में टिप्पणियाँ विशेष रूप से मूल्यवान हैं क्योंकि समवर्ती तर्क के बारे में तर्क करना बेहद कठिन है। अच्छी तरह से रखी गई टिप्पणियाँ स्पष्ट करती हैं कि एक विशेष लॉक प्रकार क्यों चुना गया था, जो भविष्य में अनुरक्षकों द्वारा गलती से डेटा दौड़ शुरू करने के जोखिम को नाटकीय रूप से कम कर देता है। यहाँ एक विशिष्ट पैटर्न है:

#शामिल करें

#शामिल

#शामिल <स्ट्रिंग>

क्लास कॉन्फ़िगरजिस्ट्री {

परिवर्तनशील std::shared_mutex mtx_; // नीचे दिए गए मानचित्र की सुरक्षा करता है

std::unordered_map data_;

सार्वजनिक:

💡 क्या आप जानते हैं?

Mewayz एक प्लेटफ़ॉर्म में 8+ बिजनेस टूल्स की जगह लेता है

सीआरएम · इनवॉइसिंग · एचआर · प्रोजेक्ट्स · बुकिंग · ईकॉमर्स · पीओएस · एनालिटिक्स। निःशुल्क सदैव योजना उपलब्ध।

निःशुल्क प्रारंभ करें →

// पथ पढ़ें: कई थ्रेड इसे एक साथ कॉल कर सकते हैं

std::string प्राप्त करें(const std::string& key) const {

std::shared_lock लॉक(mtx_); // साझा लॉक - समवर्ती पढ़ने के लिए सुरक्षित

ऑटो इट = डेटा_.फाइंड(कुंजी);

इसे वापस करें !=data_.end() ? यह->दूसरा: "";

}

// पथ लिखें: विशेष पहुंच आवश्यक है

शून्य सेट (स्थिरांक std::स्ट्रिंग और कुंजी, स्थिरांक std::स्ट्रिंग और वैल) {

std::unique_lock लॉक(mtx_); // एक्सक्लूसिव लॉक - सभी पाठकों को ब्लॉक करता है

डेटा_[कुंजी] = वैल;

}

};

ध्यान दें कि टिप्पणियाँ प्रत्येक लॉक विकल्प के पीछे के इरादे को कैसे समझाती हैं, बजाय इसके कि कोड क्या करता है। यह स्वर्ण मानक है: टिप्पणियों को क्यों का उत्तर देना चाहिए, क्या का नहीं। म्यूटेक्स पर म्यूटेबल कीवर्ड get() को एक सामान्य और मुहावरेदार पैटर्न लॉक करने में सक्षम होने के साथ-साथ कॉन्स्ट घोषित करने की अनुमति देता है।

मुख्य जानकारी: हमेशा std::shared_mutex के साथ RAII लॉक रैपर (std::shared_lock, std::unique_lock) का उपयोग करें - कभी भी लॉक() और अनलॉक() को मैन्युअल रूप से कॉल न करें। अपवादों की उपस्थिति में मैन्युअल लॉकिंग गतिरोध और अपरिभाषित व्यवहार का एक गारंटीकृत मार्ग है।

std::shared_mutex के साथ काम करते समय आम समस्याएं क्या हैं?

स्पष्ट टिप्पणियों और अच्छे इरादों के साथ भी, std::shared_mutex में सूक्ष्म जाल हैं जो अनुभवी डेवलपर्स को परेशान करते हैं। सबसे खतरनाक है लॉक अपग्रेड: किसी साझा लॉक को पहले रिलीज़ किए बिना उसे एक्सक्लूसिव लॉक में अपग्रेड करने का कोई अंतर्निहित तरीका नहीं है। बिना पुनः ऐसा करने का प्रयास कर रहा हूँ

Frequently Asked Questions

std::shared_mutex क्या है और यह C++17 में क्यों पेश किया गया?

std::shared_mutex एक सिंक्रोनाइज़ेशन प्रिमिटिव है जो C++17 मानक में जोड़ा गया। यह कई थ्रेड्स को एक साथ रीड लॉक रखने की अनुमति देता है, जबकि राइट ऑपरेशन के लिए विशेष पहुंच सुनिश्चित करता है। इससे रीड-हेवी वर्कलोड में प्रदर्शन में काफी सुधार होता है क्योंकि कई रीडर्स बिना ब्लॉक हुए समानांतर रूप से डेटा पढ़ सकते हैं।

shared_mutex और सामान्य mutex में क्या अंतर है?

सामान्य std::mutex एक समय में केवल एक थ्रेड को एक्सेस देता है, चाहे वह रीड हो या राइट। वहीं std::shared_mutex दो प्रकार के लॉक प्रदान करता है — शेयर्ड लॉक (कई रीडर्स एक साथ) और एक्सक्लूसिव लॉक (एक राइटर)। यह रीडर-राइटर पैटर्न को कुशलता से लागू करता है, जिससे मल्टीथ्रेडेड एप्लिकेशन का प्रदर्शन बेहतर होता है।

std::shared_mutex का उपयोग किन परिदृश्यों में सबसे उपयुक्त है?

यह उन परिदृश्यों में सबसे उपयुक्त है जहां डेटा बार-बार पढ़ा जाता है लेकिन कम लिखा जाता है, जैसे कैश सिस्टम, कॉन्फ़िगरेशन डेटा, या डेटाबेस कनेक्शन पूल। Mewayz जैसे 207-मॉड्यूल बिज़नेस OS प्लेटफ़ॉर्म में भी ऐसे कॉनकरेंसी पैटर्न का उपयोग होता है, जहां कई उपयोगकर्ता एक साथ डेटा एक्सेस करते हैं।

C++ मल्टीथ्रेडिंग सीखने के बाद व्यावहारिक अनुभव कैसे प्राप्त करें?

सबसे पहले छोटे प्रोजेक्ट बनाएं जैसे थ्रेड-सेफ कैश या प्रोड्यूसर-कंज्यूमर पैटर्न। फिर ओपन-सोर्स प्रोजेक्ट्स में योगदान दें। अपने प्रोजेक्ट्स को प्रदर्शित करने और अपना बिज़नेस बढ़ाने के लिए app.mewayz.com पर Mewayz का उपयोग करें — केवल $19/माह से शुरू, जो फ्रीलांस डेवलपर्स के लिए आदर्श प्लेटफ़ॉर्म है।

Mewayz मुफ़्त आज़माएं

सीआरएम, इनवॉइसिंग, प्रोजेक्ट्स, एचआर और अधिक के लिए ऑल-इन-वन प्लेटफॉर्म। कोई क्रेडिट कार्ड आवश्यक नहीं।

आज ही अपने व्यवसाय का प्रबंधन अधिक स्मार्ट तरीके से शुरू करें।

30,000+ व्यवसायों से जुड़ें। सदैव मुफ़्त प्लान · क्रेडिट कार्ड की आवश्यकता नहीं।

क्या यह उपयोगी पाया गया? इसे शेयर करें।

क्या आप इसे व्यवहार में लाने के लिए तैयार हैं?

30,000+ व्यवसायों में शामिल हों जो मेवेज़ का उपयोग कर रहे हैं। सदैव निःशुल्क प्लान — कोई क्रेडिट कार्ड आवश्यक नहीं।

मुफ़्त ट्रायल शुरू करें →

कार्रवाई करने के लिए तैयार हैं?

आज ही अपना मुफ़्त Mewayz ट्रायल शुरू करें

ऑल-इन-वन व्यवसाय प्लेटफॉर्म। क्रेडिट कार्ड की आवश्यकता नहीं।

निःशुल्क प्रारंभ करें →

14-दिन का निःशुल्क ट्रायल · क्रेडिट कार्ड नहीं · कभी भी रद्द करें