ฉันมีรายการที่ฉันต้องการให้เธรดต่าง ๆ หยิบองค์ประกอบ เพื่อหลีกเลี่ยงการล็อก 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