2011-06-23 5 views
12

यह एक शुरुआती प्रश्न है जो मुझे लगता है लेकिन मुझे इस विशेष प्रश्न का उत्तर नहीं मिला:< vector > थ्रेडसेफ अलग-अलग स्थानों पर पढ़ने/लिखने के लिए है?

मेरे पास आकार 10 का मानक (सी ++) वेक्टर वी है और टाइप int है।

यह सभी धागे को बदलने के लिए सुरक्षित है (v.at (0) = x; v.at (2) = y; आदि) और अन्य धागा अजीब स्थितियों के लिए सभी मानों को बदल देता है (v.at (1) = ए; v.at (3) = बी; आदि) एक ही समय में?

इसलिए, इन 2 धागे के जीवनकाल के दौरान आकार, कोई push_back() इत्यादि नहीं बदल रहा है।

यदि यह सुरक्षित नहीं है, तो क्या यह एक सरणी का उपयोग करने का बेहतर तरीका होगा?

आपकी सहायता के लिए धन्यवाद।

उत्तर

10

vector किसी भी धागे की सुरक्षा की गारंटी देता है प्रदान नहीं करता है, तो तकनीकी रूप से जवाब नहीं होगा।

प्रैक्टिस में, आप इसे दूर करने में सक्षम होना चाहिए ... जब तक कि कोई व्यक्ति (संभवतः आप) प्रोग्राम के एक कोने में एक छोटा बदलाव नहीं करता है और सभी नरक टूट जाते हैं। मैं किसी भी गैर-तुच्छ कार्यक्रम में ऐसा करने में सहज महसूस नहीं करूंगा।

+1

के बाद इस एप्लिकेशन को वितरित किया जाता है रातों की नींद हराम बचने की कोशिश कर के लिए +1 और, बुरा, उन्नत की गई है/बनाए रखा :(आपके उत्तर के लिए धन्यवाद –

+0

मैं देख तुम क्या मतलब है ... हालांकि:। कैसे आप दृष्टिकोण होगा समस्या? क्योंकि विचार गणना समय साझा करने के लिए भागों में चर के एक बड़े ग्रिड को विभाजित करना है। पूरे ग्रिड/वेक्टर पर एक लॉक चीजों को धीमा कर देगा –

+2

@ बेंथेबियर: शायद विपरीत तरफ से ... उत्पन्न भागों में ग्रिड, किसी भी लॉकिंग के साथ स्वतंत्र रूप से प्रत्येक भाग को संसाधित करते हैं, और आखिरकार परिणामों को मर्ज करते हैं। क्या यह काम कर सकता है? – Jon

4

आपके द्वारा वर्णित परिदृश्य ट्रेड-सुरक्षित होगा - आप प्रभावी रूप से एक निश्चित आकार सरणी के अलग-अलग तत्वों में हेरफेर करते हैं (क्योंकि vector आकार उन परिचालनों के दौरान नहीं बदलेगा), इसलिए आपको पहले स्थान पर किसी भी अतिरिक्त सिंक्रनाइज़ेशन की आवश्यकता नहीं है आप किसी भी तत्व को एक से अधिक धागे से जोड़ते हैं (जो आप नहीं हैं)।

7

MSDN से: Thread Safety in the Standard C++ Library

के लिए एक ही वस्तु को पढ़ता है, वस्तु पढ़ने के लिए सुरक्षित धागा है:

  • एक समय में एक धागा से जब अन्य थ्रेड पर कोई लेखकों।
  • एक समय में कई धागे से जब अन्य धागे पर कोई लेखक नहीं।

एक ही वस्तु के लिए लेखन के लिए, वस्तु जब अन्य धागे

के लिए एक ही कक्षा के विभिन्न वस्तुओं के लिए पढ़ता है पर कोई पाठक, वस्तु पढ़ने के लिए धागा सुरक्षित है एक धागे से लिखने के लिए धागा सुरक्षित है :

  • एक समय में एक थ्रेड से।
  • एक समय में एक थ्रेड से जब अन्य धागे पर कोई लेखक नहीं।
  • एक समय में कई धागे से।
  • एक समय में कई धागे से जब अन्य धागे पर कोई लेखक नहीं।

एक ही कक्षा के विभिन्न वस्तुओं के लिए लेखन के लिए, वस्तु लिखने के लिए धागा सुरक्षित है:

  • एक थ्रेड से जब अन्य थ्रेड पर कोई पाठकों।
  • कई धागे से।

तो ऊपर, Theorotically से, नहीं, ऐसा नहीं threadsafe हो जाएगा।

4

सैद्धांतिक रूप से: नहीं।

व्यावहारिक रूप से: हाँ (अनुसार सब कैसे अच्छी तरह से ज्ञात stls लागू किया जाता है)

5

यह मशीन-निर्भर है। यदि आपके पास vector<char> है तो प्रोसेसर अलग-अलग शब्दों में v [i] और v [i + 1] लोड करने में सक्षम नहीं हो सकता है। आपके पास कैश स्थिरता समस्या हो सकती है।

दोनों कंपाइलर और प्रोसेसर निर्देशों को फिर से ऑर्डर कर सकते हैं, जो उपरोक्त लागू नहीं होने पर भी आपके प्रोग्राम को तोड़ सकता है। This is why C++0x has a memory model.

संबंधित मुद्दे