सबसे मजबूत-गारंटी समाधान ऐसे सभी कार्यों पर पूरी सदिश (जो कोड में हर जगह से नियंत्रित करने का मतलब है हर आपरेशन लॉक करने के लिए है , जो वास्तव में एक सिंक्रनाइज़ वेक्टर बनाने का मतलब है)।
हो सकता है कि इस के रूप में सरल कुछ अपने उद्देश्यों के लिए करना होगा:
इस बारे में
int append(std::vector<int>& numbers, int number){
int retval = numbers.size();
// what if some other thread calls push_back(number) in between these calls?
numbers.push_back(number);
int newSize = numbers.size();
//this bit is as a short-cut in common, easy, cases
if(newSize = retval + 1) //no need for further complication
return retval;
while(++retval < newSize)
if(numbers[retval] == number)
return retval;
//If we get this far, numbers have been deleted, not added. More discussion below.
}
एक बात यह है कि अगर धागे धक्का 3, 3, 3, 3 तो सूचकांक लौटे गलत हो जाएगा, हालांकि यह अभी भी एक सूचकांक होगा 3. चाहे वह ठीक है या नहीं, आपके उद्देश्यों पर निर्भर करता है।
दूसरा यह है कि अगर वेक्टर पॉप या अन्यथा कम हो जाता है, तो सबसे अच्छा यह है कि हम उस बिंदु पर पहुंच जाते हैं जहां मैंने ऊपर दिए गए कोड में एक टिप्पणी डाली है, इससे भी बदतर त्रुटियां हैं (जैसे ही हम प्राप्त करने के बाद फिर से पॉप करते हैं नया आकार, और फिर [retval] तक पहुंच अमान्य हो जाता है)। आपको यह विचार करने की आवश्यकता है कि क्या यह मामला हो सकता है (शायद आप उस कोड के बाकी हिस्सों से जानते हैं जो कभी नहीं करेगा) और यदि ऐसा होता है तो क्या करना है।
यदि आपके उपयोग के मामले में इसकी सीमाएं बहुत अच्छी हैं, तो पूरी तरह सिंक्रनाइज़ वेक्टर का उत्पादन करना सबसे अच्छा है, मुझे लगता है कि मैं डरता हूं।
स्रोत
2010-08-10 09:28:25
दरअसल, पुश_बैक() ने इंडेक्स लौटाया तो यह आसान नहीं होगा, क्योंकि push_back() स्वयं थ्रेड सुरक्षित नहीं है –
आपको अपने कंटेनर को सभी समवर्ती लेखनों के विरुद्ध सुरक्षित रखने की आवश्यकता है। समवर्ती सादे push_back() को पहले से ही वेक्टर-बाहरी सिंक्रनाइज़ेशन की आवश्यकता है –
ध्यान रखें कि कई वास्तविक-दुनिया अनुप्रयोगों के लिए, छोटे थ्रेड-सुरक्षित संचालन करना सही समाधान नहीं है: आपको कोड के बड़े हिस्से की सुरक्षा करने पर विचार करना चाहिए।यदि आप उन्हें संचार तंत्र के रूप में उपयोग कर रहे हैं तो थ्रेड-सुरक्षित संग्रह अच्छे हैं। उस ने कहा, यह एक ऐसा मामला हो सकता है। –