Есть масса вопросов о том, как реализовать потокобезопасные счетчики ссылок. И общий ответ, получивший большое количество голосов: «использовать атомарное приращение / уменьшение». Хорошо, это хороший способ читать и писать refCounter без того, чтобы другой поток менял его между ними. Но.
Мой код:
void String::Release()
{
if ( 0 == AtomicDecrement( &refCounter ) ) )
delete buffer;
}
Итак. Я уменьшаю и читаю refCounter в сейфе. Но что, если другой поток УВЕЛИЧИТ мой refCounter, пока я сравниваю его с нулем ????
Я ошибаюсь?
РЕДАКТИРОВАТЬ: (пример)
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;
Я ошибаюсь?