मेरे पास एक सूची है जो मुझे तत्वों को हथियाने के लिए अलग-अलग धागे चाहिए। खाली होने पर सूची की रक्षा करने वाले म्यूटेक्स को लॉक करने से बचने के लिए, मैं empty()
लॉक करने से पहले जांच करता हूं ।
यदि कॉल list::empty()
100% सही नहीं है तो ठीक है । मैं केवल समवर्ती list::push()
और list::pop()
कॉल को क्रैश या बाधित करने से बचना चाहता हूं ।
क्या मैं वीसी ++ और गुन्नू जीसीसी को संभालने के लिए सुरक्षित हूं, केवल कभी-कभी empty()
गलत हो जाएगा और इससे बुरा कुछ नहीं होगा?
if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes
mutex.lock();
if(list.empty() == false){ // check again while locked to be certain
element = list.back();
list.pop_back();
}
mutex.unlock();
}
std::list::size
निरंतर समय की जटिलता की गारंटी है, जिसका मूल अर्थ है कि आकार (नोड्स की संख्या) को एक अलग चर में संग्रहीत करने की आवश्यकता है; चलो इसे बुलाओ size_
। std::list::empty
तब संभावना है कि कुछ के रूप में वापस आता है size_ == 0
, और समवर्ती पढ़ने और लिखने के size_
कारण डेटा की दौड़ होगी, इसलिए, यूबी।