Saya punya daftar yang saya ingin utas berbeda untuk mengambil elemen. Untuk menghindari mengunci mutex yang menjaga daftar ketika kosong, saya periksa empty()sebelum mengunci.
Tidak apa-apa jika panggilan list::empty()tidak 100% benar. Saya hanya ingin menghindari menabrak atau mengganggu panggilan list::push()dan list::pop()panggilan bersamaan .
Apakah saya aman untuk mengasumsikan VC ++ dan Gnu GCC hanya akan terkadang empty()salah dan tidak ada yang lebih buruk?
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::sizetelah menjamin kompleksitas waktu yang konstan, yang pada dasarnya berarti bahwa ukuran (jumlah node) perlu disimpan dalam variabel yang terpisah; sebut saja itu size_. std::list::emptymaka kemungkinan mengembalikan sesuatu sebagai size_ == 0, dan membaca dan menulis bersamaan size_akan menyebabkan perlombaan data, oleh karena itu, UB.