मेरे पास एक std :: नक्शा है जिसका उपयोग मैं मूल्यों (फ़ील्ड आईडी) को मानव पठनीय स्ट्रिंग में मैप करने के लिए करता हूं। यह नक्शा तब शुरू होता है जब मेरा प्रोग्राम किसी भी अन्य थ्रेड शुरू होने से पहले शुरू होता है, और इसके बाद इसे कभी भी संशोधित नहीं किया जाता है। अभी, मैं प्रत्येक धागे को अपनी (बल्कि बड़ी) मानचित्र की अपनी प्रतिलिपि देता हूं लेकिन यह स्पष्ट रूप से स्मृति का अक्षम उपयोग है और यह प्रोग्राम स्टार्टअप धीमा करता है। तो मैं मानचित्र पर प्रत्येक थ्रेड को पॉइंटर देने की सोच रहा था, लेकिन इससे थ्रेड-सुरक्षा समस्या बढ़ जाती है।केवल पढ़ने के लिए संचालन के लिए std :: मानचित्र की थ्रेड सुरक्षा
सब मैं कर रहा हूँ निम्नलिखित कोड का उपयोग कर नक्शा से पढ़ है:
std::string name;
//here N is the field id for which I want the human readable name
unsigned field_id = N;
std::map<unsigned,std::string>::const_iterator map_it;
// fields_p is a const std::map<unsigned, std::string>* to the map concerned.
// multiple threads will share this.
map_it = fields_p->find(field_id);
if (map_it != fields_p->end())
{
name = map_it->second;
}
else
{
name = "";
}
क्या यह काम या वहाँ एक std :: एक से अधिक थ्रेड से नक्शा पढ़ने के साथ मुद्दों कर रहे हैं?
नोट: मैं वर्तमान में विजुअल स्टूडियो 2008 के साथ काम कर रहा हूं, लेकिन मैं इसे मुख्य मुख्य एसटीएल कार्यान्वयन के लिए एक्रोस काम करना चाहता हूं।
अद्यतन: कॉन्स्ट शुद्धता के लिए संपादित कोड नमूना।
नोट: इस सवाल का जवाब एसजीआई एसटीएल implemenation तक सीमित है। ओपी ने उल्लेख नहीं किया कि किस का उपयोग किया जाता है। – foraidt
सच है, मैं इस जानकारी को जोड़ने के लिए संपादित कर दूंगा। – laura
मैं विजुअल स्टूडियो 2008 के साथ आने वाले कार्यान्वयन का उपयोग करता हूं, लेकिन मैं ऐसे उत्तर की तलाश में था जो सामान्य रूप से std :: मानचित्र को कवर करता है, या कम से कम अधिकांश कार्यान्वयन में यदि यह संभव हो तो। –