スレッド セーフな参照カウンターを実装する方法については、たくさんの質問があります。そして、よく投票された答えは、「アトミックインクリメント/デクリメントを使用する」です。わかりました。これは、他のスレッドが途中で変更することなく、refCounter を読み書きするための良い方法です。しかし。
私のコードは次のとおりです。
void String::Release()
{
if ( 0 == AtomicDecrement( &refCounter ) ) )
delete buffer;
}
そう。安全にrefCounterをデクリメントして読み取ります。しかし、私が refCounter をゼロと比較しているときに、他のスレッドが私の refCounter を INCREMENT するとどうなるでしょうか????
私が間違っている?
編集:(例)
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;
私が間違っている?