2012-01-26 6 views
6

में आकार फ़ंक्शन और थ्रेड-सुरक्षा मुझे आश्चर्य है कि आकार के फ़ंक्शन (आकार, लंबाई या जो भी) थ्रेड सुरक्षित हैं? जैसा कि मैं समझता हूं, वे आम तौर पर बस कुछ निजी आकार के सदस्य लौटते हैं। मुझे सच में संदेह है कि वे किसी भी प्रकार की गणना करते हैं। वे सभी को कॉन्स के रूप में चिह्नित किया जाता है लेकिन क्या वे थ्रेड-सुरक्षित हैं? उदाहरण के लिए std :: सूची :: आकार?सी ++

मैं पढ़ रहा है (यह भी लॉक-सुरक्षित), लेकिन मुझे आश्चर्य है कि अगर मेरे गिनती समारोह भी ताला संरक्षित किया जाना चाहिए के लिए लिखने के लिए एक ताला संरक्षित समारोह और एक अन्य है? आईएमओ, यह प्रतिक्रिया समय की बर्बादी की तरह दिखता है। मुझे नहीं लगता कि यह किसी भी इटरेटर को तोड़ सकता है या असफल हो सकता है अगर किसी सदस्य को एक ही समय में सूची से हटाया जा रहा हो (जैसा भी संभव हो)।

+1

'गिनती * * पढ़ रहा है। यदि आप अन्य पढ़ने के लिए लॉक करते हैं, तो आप 'गिनती' के लिए क्यों नहीं लॉक करेंगे? क्या यह विशेष बनाता है? –

उत्तर

6

हां, इसे लॉक द्वारा संरक्षित करने की आवश्यकता है। आइए मान लें कि आपका कार्यान्वयन std::list::size 32-बिट मान है लेकिन आपके प्लेटफ़ॉर्म 32-बिट रीड पर परमाणु नहीं हैं, वे 2 16-बिट पढ़ते हैं। इस मामले में, दूसरा धागा पहले पढ़ने के बाद आकार को पढ़ने वाले पहले को बाधित कर सकता है, आकार चर अद्यतन करें और फिर जब दूसरा 16-बिट पढ़ा जाता है तो आपको आकार के लिए वास्तविक गड़बड़ मूल्य मिल सकता है।

+1

यह समझाया गया कि यह थ्रेड-सुरक्षित क्यों नहीं है। धन्यवाद। – Pijusn

4

नहीं, वे थ्रेड-सुरक्षित नहीं हैं। मानक कंटेनर बस थ्रेड-सुरक्षित, अवधि नहीं हैं।

हालांकि सीमित मात्रा में थ्रेड सुरक्षा है: यदि प्रत्येक थ्रेड अलग तत्व तक पहुंचता है, और किसी भी समय किसी भी तत्व को दो अलग-अलग धागे द्वारा उपयोग नहीं किया जाता है, तो यह ठीक है। हालांकि, कंटेनर स्वयं को सम्मिलित करने वाला कोई भी ऑपरेशन (सम्मिलित, मिटाएं) थ्रेड-सुरक्षित नहीं है और सिंक्रनाइज़ होना चाहिए। नतीजतन, इटेटर और संदर्भ उनकी वैधता खो सकते हैं, और size() इसी तरह प्रभावित है।

दूसरे शब्दों में, यदि आप सभी कार्यों कि उन है कि नहीं कर से कंटेनर उत्परिवर्तित अलग है, तो जब तुम परिवर्तनशील नहीं कर रहे हैं, तो आप सुरक्षित रूप से size() से अधिक थ्रेड से कॉल कर सकते हैं।

+2

यह बयान कि मानक कंटेनर "बस थ्रेड-सुरक्षित नहीं हैं, अवधि" ** बहुत ** भ्रामक है! वे थ्रेड-सुरक्षा का एक बहुत ही उचित रूप प्रदान करते हैं। सिर्फ इसलिए कि कुछ लोग एक तरह की थ्रेड-सुरक्षा चाहते हैं जहां वे सभी लाभ प्राप्त करते समय थ्रैड की देखभाल किए बिना जी सकते हैं इसका मतलब यह नहीं है कि वे थ्रेड-सुरक्षित नहीं हैं! तथ्य यह है कि लोग यह नहीं समझते कि एक आदिम मूल्य तक पहुंच के लिए सिंक्रनाइज़ेशन की आवश्यकता होती है जो उनके पास थ्रेडिंग के साथ होती है। –