Có rất nhiều câu hỏi về cách thực hiện bộ đếm tham chiếu an toàn chủ đề. Và câu trả lời được bình chọn rất phổ biến là: "sử dụng tăng/giảm nguyên tử". Ok, đây là một cách tốt để đọc và viết refCounter whitout thread khác thay đổi nó ở giữa. Nhưng.Một câu hỏi khác về đếm số đếm an toàn của chủ đề
Mã của tôi là:
void String::Release()
{
if (0 == AtomicDecrement(&refCounter)))
delete buffer;
}
So. Tôi giảm và đọc refCounter trong an toàn. Nhưng điều gì sẽ xảy ra nếu các chủ đề khác sẽ TĂNG TRƯỞNG của tôi trong khi tôi so sánh nó với số không ????
Tôi có sai không?
EDIT: (ví dụ)
String* globalString = new String(); // refCount == 1 after that.
// thread 0:
delete globalString;
// This invokes String::Release().
// After AtomicDecrement() counter becomes zero.
// Exactly after atomic decrement current thread switches to thread 1.
// thread 1:
String myCopy = *globalString;
// This invokes AddRef();
// globalString is alive;
// internal buffer is still not deleted but refCounter is zero;
// We increment and switch back to thread 0 where buffer will be
// succefully deleted;
Tôi có sai lầm?
Làm thế nào thread khác có thể tăng bộ đếm nếu nó không có một tham chiếu đến đối tượng ? Giá trị bằng 0 theo nghĩa đen có nghĩa là "không còn tham chiếu". –