Öğeleri kapmak için farklı konuların olmasını istediğim bir liste var. Muteksin liste boşken kilitlenmesini önlemek için kilitlemeden empty()
önce kontrol ederim .
Çağrı list::empty()
% 100 doğru değilse sorun değil. Sadece eşzamanlı list::push()
ve list::pop()
aramaların çökmesini veya bozulmasını önlemek istiyorum .
VC ++ ve Gnu GCC'nin sadece bazen empty()
yanlış olacağını ve daha kötü bir şey olacağını varsayabilir miyim ?
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
temelde boyutu (düğüm sayısı) ayrı bir değişken içinde depolanması gerektiği anlamına gelir sabit zaman karmaşıklığı garanti ekledi; diyelim size_
. std::list::empty
muhtemelen bir şey döndürür size_ == 0
ve eşzamanlı okuma ve yazma size_
veri yarışına, dolayısıyla UB'ye neden olur.