আমার কাছে একটি তালিকা রয়েছে যা থেকে আমি বিভিন্ন থ্রেডের উপাদানগুলি দখল করতে চাই। তালিকাটি খালি থাকাকালীন মুটেক্সকে রক্ষা করা লক করা এড়াতে, আমি 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_
ফলে ডেটা দৌড় হয়, তাই ইউবি।