Ich versuche genau zu verstehen, wie thread-sichere, atomare Referenzzählung funktioniert, zum Beispiel wie mit std::shared_ptr
. Ich meine, das Grundkonzept ist einfach, aber ich bin wirklich verwirrt darüber, wie das decrf plus delete
Rennbedingungen vermeidet.Atomare Referenzzählung
Diese tutorial from Boost demonstriert, wie ein atomares Thread-sicheres Referenzzählsystem mit der Boost-Atombibliothek (oder der C++ 11-Atombibliothek) implementiert werden kann.
Okay, also bekomme ich die allgemeine Idee. Aber ich verstehe nicht, warum das folgende Szenario NICHT möglich ist:
Angenommen, der Refcount ist derzeit 1
.
- Thread A: atomar decrefs die refcount zu
0
. - Thread B: erhöht den Refcount automatisch auf
1
. - Thread A: ruft
delete
auf dem verwalteten Objektzeiger auf. - Thread B: Der Refcount wird als
1
angezeigt, greift auf den Zeiger des verwalteten Objekts zu ... SEGFAULT!
Ich kann nicht verstehen, was das Auftreten dieses Szenario verhindert, da gibt es nichts erreicht die Zeit der refcount 0 ein Daten Rennen von zwischen zu verhindern, und das Objekt gelöscht wird. Das Verringern des Refcounts und das Aufrufen von delete
sind zwei separate, nicht atomare Operationen. Wie ist das ohne Schloss möglich?
Wie ist der Refcount 1, während zwei Referenzen von den beiden Threads sind? –
Sie müssen die Invariante einer Verwendungszählung buchstabieren. Eine Verwendungszählung sollte niemals 0 erreichen, solange Benutzer vorhanden sind. Ihr Code muss irgendwo einen Fehler enthalten. – curiousguy