Tôi có một danh sách mà tôi muốn các chủ đề khác nhau để lấy các yếu tố từ đó. Để tránh bị khóa mutex bảo vệ danh sách khi nó trống, tôi kiểm tra empty()
trước khi khóa.
Không sao nếu cuộc gọi list::empty()
không đúng 100%. Tôi chỉ muốn tránh sự cố hoặc làm gián đoạn đồng thời list::push()
và list::pop()
các cuộc gọi.
Tôi có an toàn không khi cho rằng VC ++ và Gnu GCC đôi khi sẽ chỉ bị empty()
sai và không có gì tệ hơn?
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
đã đảm bảo độ phức tạp thời gian không đổi, về cơ bản có nghĩa là kích thước (số lượng nút) cần được lưu trữ trong một biến riêng biệt; chúng ta hãy gọi nó size_
. std::list::empty
sau đó có khả năng trả về một cái gì đó như size_ == 0
, và việc đọc và ghi đồng thời size_
sẽ gây ra cuộc đua dữ liệu, do đó, UB.