कैसे करता const
(संकेत, संदर्भ और सदस्य कार्यों) सी ++ में धागा सुरक्षा के साथ मदद?थ्रेड सुरक्षा और `const`
उत्तर
मुख्य समस्या एक से अधिक थ्रेड के साथ अस्थिरता है। कॉन्स इसे प्रतिबंधित करता है, लेकिन चूंकि आप कॉन्स्टेस को दूर कर सकते हैं, यह मूर्खतापूर्ण नहीं है।
सच है, लेकिन आपको पैर में खुद को शूट करने के लिए अतिरिक्त कार्य करने की आवश्यकता है। –
मैं सहमत हूं और इन दिनों सी # प्रोग्रामर के रूप में मुझे निश्चित रूप से याद आती है और –
कोई कोड मूर्ख-प्रमाण नहीं है, लेकिन आपको मच्छी के खिलाफ नहीं, मर्फी के खिलाफ रक्षा करनी चाहिए। – Gorpik
कोई अपरिवर्तनीय (यानी, अपरिवर्तनीय) डेटा स्वाभाविक रूप से थ्रेड सुरक्षित है - एकाधिक धागे के लिए समान रूप से एक ही पढ़ने-पढ़ने वाले डेटा को पढ़ने के लिए कोई जोखिम नहीं है क्योंकि यह कभी नहीं बदला जा रहा है!
सी ++ में स्थिरांक के रूप में एक चर अंकन यह केवल पढ़ने के लिए और इस तरह सुरक्षित थ्रेड बनाता है।
मान लीजिए कि आप कहीं भी म्यूटेबल का उपयोग नहीं कर रहे हैं ;-) –
और यह मानते हुए कि यह प्रारंभिक है थ्रेड-सुरक्षित है। – xtofl
प्रारंभिकरण आमतौर पर होता है। आप ऐसी ऑब्जेक्ट क्यों साझा करेंगे जिसे पूरी तरह से प्रारंभ नहीं किया गया है? –
एक स्थिरांक सदस्य समारोह राज्य में जो इसे सुरक्षित एक ही समय में एक से अधिक थ्रेड से कॉल करने के लिए बनाता है परिवर्तन नहीं होना चाहिए। हालांकि थ्रेड सुरक्षा कॉन्स का उद्देश्य नहीं है और सी ++ म्यूटेबल कीवर्ड और const_cast प्रदान करता है जिसका अर्थ है कि कॉन्स वास्तव में थ्रेड सुरक्षा की गारंटी नहीं देता है और इस उद्देश्य के लिए इस पर भरोसा नहीं किया जाना चाहिए।
कॉन्स्ट फ़ंक्शन थ्रेड सुरक्षित नहीं है। Normaly, आप अलग-अलग धागे से एक साथ कॉन्स ऑब्जेक्ट विधियों को कॉल कर सकते हैं, लेकिन यदि आप अलग-अलग धागे से नॉन कॉन्स्ट और कॉन्स्ट विधि को कॉल करते हैं तो आपको दौड़ की स्थिति मिलती है। इस जाँच करें:
class Foo
{
size_t size_;
public:
...
size_t get_size() const
{
return size_
}
};
class Bar
{
boost::shared_ptr<Foo> foo_;
public:
//accessor
size_t get_size() const
{
size_t size = 0;
if (foo_)
size = foo_->size();
return size;
}
//modifiers
void init()
{
foo_ = new Foo;
}
void clear()
{
foo_ = boost::shared_ptr<Foo>();
}
};
अगर किसी को कॉल init विधि, और फिर समवर्ती स्पष्ट फोन और तरीकों get_size, यह पहुँच उल्लंघन का कारण होगा। आपको पठन लेखन लॉक मुहावरे का उपयोग करना होगा। एक ही समय में एकाधिक एक्सेसर्स को बुलाया जा सकता है, और एक ही समय में केवल एक संशोधक को बुलाया जा सकता है। उदाहरण:
Foo myVar;
const Foo* ptr1;
Foo* ptr2;
इस को देखते हुए, स्थिरांक के रूप में कोई गारंटी प्रदान करता है:
class Bar
{
boost::shared_ptr<Foo> foo_;
mutable tbb::spin_rw_mutex lock_;
public:
//accessor
size_t get_size() const
{
size_t size = 0;
//lock modifiers
rw_mutex_type::scoped_lock lock(mutex, false);
if (foo_)
size = foo_->size();
return size;
}
//modifiers
void init()
{
//lock accessor and modifiers
rw_mutex_type::scoped_lock lock(mutex, true);
foo_ = new Foo;
}
void clear()
{
//lock accessor and modifiers
rw_mutex_type::scoped_lock lock(mutex, true);
foo_ = boost::shared_ptr<Foo>();
}
};
TBB :: spin_rw_lock threading builing blocks library से एक म्युटेक्स वर्ग
वास्तव में: स्थिरता केवल _helps_ धागा सुरक्षित अनुप्रयोगों का निर्माण – xtofl
सी ++ स्थिरांक की अनुमति देता है गैर स्थिरांक अलियासिंग जैसे है आपके डेटा की अपरिवर्तनीयता, भले ही आप इसे पाने के लिए कोई कास्टिंग या कुछ भी नहीं करते हैं। यदि आप ptr1 के माध्यम से myVar तक पहुंचते हैं, तो आप इसे ptr1 के माध्यम से नहीं बदल सकते (मान लीजिए कि मुझे सिंटैक्स सही मिला है, वह इरादा था।) हालांकि, यह अभी भी ptr2 के माध्यम से बदल सकता है। आप वास्तव में क्या चाहते हैं एक अलग अपरिवर्तनीय निर्माण है। यह सी ++ में मौजूद नहीं है।
कॉन्स्ट और धागा सुरक्षा ओर्थोगोनल अवधारणाओं रहे हैं।
एक कॉन्स फ़ंक्शन को उदाहरण के रूप में लें: एक वर्ग में दोनों कॉन्स्ट और गैर-कॉन्स फ़ंक्शन हो सकते हैं, और एक थ्रेड एक गैर-कॉन्स्ट फ़ंक्शन को कॉल कर सकता है जो ऑब्जेक्ट को उसी समय संशोधित करता है जब एक अन्य थ्रेड इसके कॉन्स फ़ंक्शन में होता है । इस मामले में, फंक्शन कॉन्स को चिह्नित करने से कोई सुरक्षा नहीं मिलती है। थ्रेड-सुरक्षा केवल लॉकिंग या अन्य सिंक्रनाइज़ेशन प्राइमेटिव के साथ हासिल की जाती है।
- 1. जावा स्ट्रिंगबिल्डर और थ्रेड सुरक्षा
- 2. थ्रेड सुरक्षा और स्थानीय चर
- 3. iBatis SqlMapClient और थ्रेड सुरक्षा
- 4. अंतिम फ़ील्ड और थ्रेड-सुरक्षा
- 5. थ्रेड सुरक्षा और स्थिर कार्यों
- 6. थ्रेड सुरक्षा
- 7. थ्रेड सुरक्षा
- 8. रूबी/रेल थ्रेड सुरक्षा
- 9. सी ++ थ्रेड सुरक्षा सारांश
- 10. जेएमएक्स एमबीएन थ्रेड सुरक्षा
- 11. std :: मानचित्र थ्रेड-सुरक्षा
- 12. स्ट्रोक फ़ंक्शन थ्रेड सुरक्षा
- 13. जावा सरणी थ्रेड-सुरक्षा
- 14. इकाई फ्रेमवर्क थ्रेड सुरक्षा
- 15. संस्कृतिइन्फो थ्रेड सुरक्षा
- 16. जावा: स्विंग लाइब्रेरीज़ और थ्रेड सुरक्षा
- 17. एडब्ल्यूटी फास्ट ग्राफिक्स और थ्रेड सुरक्षा
- 18. स्थैतिक सदस्य फ़ंक्शन और थ्रेड-सुरक्षा
- 19. पता पुस्तिका थ्रेड सुरक्षा और प्रदर्शन
- 20. क्यूटी सिग्नल और स्लॉट थ्रेड सुरक्षा
- 21. स्थैतिक सदस्य फ़ंक्शंस और थ्रेड-सुरक्षा
- 22. दृश्य सी ++ थ्रेड सुरक्षा मुक्त और मॉलोक?
- 23. डब्ल्यूसीएफ कॉलबैक, प्रॉक्सी और थ्रेड-सुरक्षा
- 24. लुसीन.NET, मानक विश्लेषक, स्टॉपवर्ड और थ्रेड-सुरक्षा
- 25. थ्रेड सुरक्षा और सिस्टम। अगला। सी #
- 26. थ्रेड सुरक्षा सुनिश्चित करना
- 27. जावा XPathFactory थ्रेड-सुरक्षा
- 28. `स्थिर const`` बनाम const`
- 29. const int = int const?
- 30. execv() और const-ness
ऐसा नहीं है। सिर्फ इसलिए कि एक चर का संदर्भ है, यह इंगित नहीं करता है कि उस चर के लिए कोई गैर संदर्भ नहीं है। –
@ChrisBecke वैसे, यह http://stackoverflow.com/questions/14127379/does-const-mean-thread-safe-in-c11 एक बेहतर सवाल है, और अधिक मसा के साथ पूछा है। मुझे लगता है कि वहां दिए गए उत्तरों से पता चलता है कि एक ग्लिब 'यह नहीं है' पर्याप्त नहीं है। –