我有一个列表,希望不同的线程从中获取元素。为了避免在列表为空时锁定保护该列表的互斥锁,请empty()在锁定之前进行检查。
如果对电话的呼叫在list::empty()100%的时间内都不正确,则可以。我只想避免崩溃或中断并发list::push()和list::pop()调用。
我是否可以肯定地认为VC ++和Gnu GCC有时只会empty()出错并且没有比这更糟的了?
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。