다른 스레드가 요소를 가져 오기를 원하는 목록이 있습니다. 비어있을 때 목록을 보호하는 뮤텍스를 잠그지 않으려면 잠그기 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입니다.