यह निर्भर करता है कि आप क्या उम्मीद करते हैं। अन्य उत्तरों सही हैं सामान्य में, मानक सी ++ कंटेनर थ्रेड-सुरक्षित नहीं हैं, और इसके अलावा, विशेष रूप से में आपका कोड पर आपके कॉल के बीच कंटेनर को संशोधित करने वाले किसी अन्य थ्रेड के खिलाफ वार्ड नहीं करता है और इसके अधिग्रहण लॉक (लेकिन यह मामला vector::empty
की धागा सुरक्षा से असंबंधित है)।
तो, किसी भी गलतफहमी को दूर करने के लिए: आपका कोड items
ब्लॉक के अंदर खाली नहीं होगा।
लेकिन आपका कोड अभी भी उपयोगी हो सकता है, क्योंकि आप जो करना चाहते हैं वह अनावश्यक लॉक रचनाओं से बचने के लिए है। आपका कोड गारंटी नहीं देता है लेकिन एक अनावश्यक लॉक निर्माण को रोक सकता है। यह सभी मामलों में काम नहीं करेगा (अन्य थ्रेड अभी भी आपके चेक और लॉक के बीच कंटेनर खाली कर सकते हैं) लेकिन में मामले हैं। और यदि आप सब कुछ एक अनावश्यक ताला छोड़कर एक अनुकूलन है, तो आपका कोड उस लक्ष्य को पूरा करता है।
बस सुनिश्चित करें कि किसी भी वास्तविक पहुँच कंटेनर करने के लिए ताले द्वारा संरक्षित है या नहीं।
वैसे, ऊपर सख्ती से बोल रहा है अपरिभाषित व्यवहार: एक एसटीएल कार्यान्वयन सैद्धांतिक रूप से empty
करने के लिए कॉल के अंदर mutable
सदस्यों को संशोधित करने के लिए अनुमति दी है। इसका मतलब यह होगा कि स्पष्ट रूप से हानिरहित (केवल पढ़ने के लिए) empty
पर कॉल वास्तव में एक संघर्ष का कारण बन सकता है। दुर्भाग्यवश, आप इस धारणा पर भरोसा नहीं कर सकते कि केवल-पढ़ने वाली कॉल एसटीएल कंटेनरों के साथ सुरक्षित हैं।
व्यवहार में, हालांकि, मैं बहुत यकीन है कि vector::empty
किसी भी सदस्य नहीं संशोधित करेंगे।लेकिन पहले से ही list::empty
के लिए मुझे कम यकीन है। यदि आप वास्तव में की गारंटी देते हैं, तो या तो प्रत्येक एक्सेस को लॉक करें या STL कंटेनर का उपयोग न करें।
स्रोत
2010-11-17 14:50:10
प्रतिक्रियाओं के लिए धन्यवाद। प्रश्न को स्पष्ट करने के लिए: अन्य धागे आइटम में जोड़ देंगे। आइटम से कोई अन्य धागा नहीं हटाएगा - हटाएगा केवल DoStuffWithItems() के अंदर होगा और केवल एक ही थ्रेड DoStuff() को कॉल करेगा। यह ठीक है अगर item.empty() झूठी रिटर्न देता है जबकि एक और धागा इसमें जोड़ रहा है। यह ठीक नहीं है अगर आइटम्स.empty() एप्लिकेशन को क्रैश करने का कारण बनता है यदि कोई अन्य थ्रेड इसमें जोड़ रहा है –