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::size
telah 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::empty
maka kemungkinan mengembalikan sesuatu sebagai size_ == 0
, dan membaca dan menulis bersamaan size_
akan menyebabkan perlombaan data, oleh karena itu, UB.