Еще один вопрос о поточно-безопасном подсчете ссылок

Есть масса вопросов о том, как реализовать потокобезопасные счетчики ссылок. И общий ответ, получивший большое количество голосов: «использовать атомарное приращение / уменьшение». Хорошо, это хороший способ читать и писать 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;

Я ошибаюсь?

5
задан skaffman 8 February 2011 в 15:48
поделиться