के साथ सम्मिलन लॉक करने के बावजूद std :: unordered_map के साथ डेटा रेस मेरे पास एक सी ++ 11 प्रोग्राम है जो कुछ कंप्यूटेशंस करता है और उन कंप्यूटेशंस के परिणामों को कैश करने के लिए std::unordered_map
का उपयोग करता है। कार्यक्रम एकाधिक धागे का उपयोग करता है और वे कंप्यूटेशंस के परिणामों को संग्रहीत करने और साझा करने के लिए साझा unordered_map
का उपयोग करते हैं।mdx
unordered_map
और एसटीएल कंटेनर चश्मा के अपने पढ़ने के साथ-साथ unordered_map thread safety के आधार पर, ऐसा लगता है कि एक unordered_map
, एक से अधिक थ्रेड द्वारा साझा, एक समय में एक धागा लेखन, लेकिन एक समय में कई पाठकों संभाल कर सकते हैं।
इसलिए, मैं std::mutex
का उपयोग कर रहा हूं ताकि insert()
मानचित्र पर कॉल को लपेट सके, ताकि एक समय में केवल एक ही थ्रेड डाला जा सके।
हालांकि, मेरे find()
कॉल में मेरे पढ़ने से म्यूटेक्स नहीं है, ऐसा लगता है कि कई धागे एक बार में पढ़ने में सक्षम होना चाहिए। हालांकि, मुझे कभी-कभी डेटा रेस मिलती है (जैसा कि टीएसएएन द्वारा पता चला है), स्वयं को एसईजीवी में प्रकट कर रहा है। डेटा रेस स्पष्ट रूप से ऊपर वर्णित insert()
और find()
कॉल को इंगित करती है।
जब मैं find()
कॉल को म्यूटेक्स में लपेटता हूं, तो समस्या दूर हो जाती है। हालांकि, मैं समवर्ती पढ़ने को क्रमबद्ध नहीं करना चाहता, क्योंकि मैं इस कार्यक्रम को जितनी जल्दी हो सके बनाने की कोशिश कर रहा हूं। (एफवाईआई: मैं जीसीसी 5.4 का उपयोग कर दौड़ रहा हूं।)
ऐसा क्यों हो रहा है? क्या std::unordered_map
की समवर्ती गारंटी की मेरी समझ गलत है?
ऐसा लगता है कि आपको 'shared_mutex' की आवश्यकता है क्योंकि सभी लिखने और पढ़ने के लिए कॉल को सिंक्रनाइज़ेशन की आवश्यकता होती है क्योंकि आपके पास लेखक है। – NathanOliver
लिंक्ड थ्रेड में उत्तर यह कहता है: "* ए। एक ही समय में पढ़ने वाले एकाधिक थ्रेड, * ** या ** * बी। एक ही समय में एक थ्रेड लेखन *"। ** या ** ध्यान दें। – Pixelchemist
आपने कल्पना का गलत व्याख्या किया है; यह एकाधिक पाठकों को अनुमति देता है, लेकिन एकल लेखक की परवाह किए बिना एकाधिक पाठक नहीं। आपको नाथनऑलिवर की टिप्पणी – antlersoft