Öğ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::sizetemelde 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::emptymuhtemelen bir şey döndürür size_ == 0ve eşzamanlı okuma ve yazma size_veri yarışına, dolayısıyla UB'ye neden olur.