मैं pthread (C++ 98 मानक) का उपयोग कर एक बहुप्रचारित C++ प्रोग्राम बना रहा हूं।सी ++ मानचित्र के लिए थ्रेड सिंक्रनाइज़ेशन
मेरे पास एक std :: नक्शा है जो एकाधिक धागे तक पहुंच जाएगा। पहुंच [] ऑपरेटर का उपयोग करके तत्वों को जोड़ने और निकालने के लिए तत्वों को जोड़कर और हटाएगी।
मैं समझता हूं कि [] ऑपरेटर का उपयोग करके पढ़ना, या इसके साथ तत्वों को संशोधित करना भी धागा सुरक्षित है, लेकिन शेष परिचालन नहीं हैं।
पहला प्रश्न: क्या मैं इसे सही ढंग से समझता हूं?
कुछ धागे केवल [] के माध्यम से तत्वों तक पहुंचेंगे, जबकि अन्य कुछ अन्य परिचालन करेंगे। जाहिर है मुझे थ्रेड सिंक्रनाइज़ेशन के कुछ रूप की आवश्यकता है।
जिस तरह से मुझे यह देखना चाहिए, यह है: - हालांकि मानचित्र पर कोई "लिखना" ऑपरेशन नहीं किया जा रहा है, धागे सभी को इसके साथ "पढ़ने" में सक्षम होना चाहिए। - जब कोई धागा मानचित्र पर "लिखना" चाहता है, तो उसे लॉक सेट करना चाहिए ताकि कोई थ्रेड किसी भी "पठन" या "लिखने" ऑपरेशन को शुरू न करे, और फिर इसे तब तक इंतजार करना चाहिए जब तक कि सभी "पढ़े" ऑपरेशन पूर्ण नहीं हो जाते हैं, किस बिंदु पर यह ऑपरेशन करेगा और ताले को छोड़ देगा। - ताले जारी किए जाने के बाद, सभी धागे स्वतंत्र रूप से पढ़ने में सक्षम होना चाहिए।
मुख्य प्रश्न यह है कि: इस व्यवहार को प्राप्त करने के लिए मैं किस थ्रेड सिंक्रनाइज़ेशन विधियों का उपयोग कर सकता हूं?
मैंने म्यूटेक्स, सशर्त चर और सेमफोरों के बारे में पढ़ा है, और जहां तक मैं देख सकता हूं कि वे मुझे जो चाहिए वह उत्कृष्टता से नहीं करेंगे। मैं mutex से परिचित हूँ लेकिन cond के साथ नहीं। चर या semaphores।
मुझे लगता है कि मुख्य समस्या यह है कि जब तक कुछ घटित नहीं होता है (लिखना ऑपरेशन समाप्त होता है) तब तक धागे को लॉक करने का एक तरीका चाहिए, फिर बदले में कुछ भी लॉक कर दें। इसके अलावा मुझे एक उल्टा सेमफोर की तरह कुछ चाहिए, जो कि काउंटर 1 से अधिक होने पर ब्लॉक करता है और फिर 0 होता है जब जागता है (यानी कोई पढ़ा नहीं जा रहा है)।
अग्रिम धन्यवाद।
पीएस यह मेरी पहली पोस्ट है। कृपया संकेत दें कि क्या मैं कुछ गलत कर रहा हूं!
क्या आपको केवल एक पाठक-लेखक म्यूटेक्स चाहिए? –
आपको आरडब्लू लॉक की आवश्यकता है, [इस उदाहरण।] (Http://stackoverflow.com/questions/989795/example-for-boost-shared-mutex-multiple-reads-one-write) – gbjbaanb
एक अच्छी पहली पोस्ट। निश्चित रूप से आप [सी ++ 11] (http://en.cppreference.com/w/cpp/thread) का उपयोग नहीं कर सकते हैं? यह आपके कोड को सरल बना देगा, और इसे और अधिक पोर्टेबल बना देगा। कंटेनर तत्वों की प्रकृति के आधार पर, आपको भारी थ्रेड सुविधाओं की आवश्यकता नहीं हो सकती है। शायद [सिंक] (http://en.cppreference.com/w/cpp/atomic) primitives पर्याप्त होगा। –