スレッドセーフリファレンスカウンタを実装する方法には、多大な疑問があります。 よく投票される答えは、「原子の増分/減分を使用する」です。 これは、refCounterを他のスレッドとの間で変更して読み書きする良い方法です。しかし。スレッドセーフリファレンスカウントに関する別の質問
私のコードは次のとおりです。
void String::Release()
{
if (0 == AtomicDecrement(&refCounter)))
delete buffer;
}
Soが私はrefCounterを減らして安全に読む。しかし、もし私がそれをゼロと比較している間に、他のスレッドがrefCounterをインクリメントするのであれば?
私は間違っていますか?
EDIT:(例)
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;
は私が間違っていますか?
? 0の値は、文字通り「参照が残っていない」ことを意味します。 –