ฉันมีรายการที่ฉันต้องการให้เธรดต่าง ๆ หยิบองค์ประกอบ เพื่อหลีกเลี่ยงการล็อก mutex ที่ป้องกันรายการเมื่อว่างฉันempty()จะตรวจสอบก่อนล็อก
ไม่เป็นไรหากการโทรไปlist::empty()ไม่ถูกต้อง 100% ของเวลา ฉันเพียงต้องการหลีกเลี่ยงการหยุดทำงานหรือรบกวนการทำงานพร้อมกันlist::push()และการlist::pop()โทร
ฉันปลอดภัยempty()ไหมที่จะสมมติว่า VC ++ และ Gnu GCC บางครั้งจะผิดพลาดและไม่มีอะไรเลวร้ายไปกว่านี้
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_จะทำให้เกิดการแข่งขันข้อมูลดังนั้น UB