Bedenken Sie, dass das Sperren sehr teuer ist, und jedes Mal, wenn Sie Objekte zwischen intelligenten Zeigern übergeben - auch wenn das Objekt derzeit einem Thread gehört (die intelligente Zeigerbibliothek weiß das nicht).
dies gegeben, kann es eine Faustregel gilt: anwendbar hier (ich bin glücklich korrigiert werden!)
Wenn die Folge Dinge auf Sie zutreffen:
- Sie komplexe Datenstrukturen haben, die wäre schwer Destruktoren für schreiben (oder wo STL-Stil Wert Semantik wäre unpassend, von Entwurf), so dass Sie Smart-Zeigern, es für Sie zu tun, und
- Sie verwenden mehrere Threads, die diese Objekte teilen, und
- Sie interessieren sich für per Formance sowie Korrektheit
... dann kann die tatsächliche Garbage Collection eine bessere Wahl sein. Obwohl GC einen schlechten Ruf für die Leistung hat, ist alles relativ. Ich glaube, dass es sehr gut mit dem Sperren von Smartpointern verglichen wird. Es war ein wichtiger Teil, warum das CLR-Team sich für echte GC entschieden hat und nicht für eine Referenzzählung. Siehe this article, insbesondere diese krassen Vergleich dessen, was Referenzzuordnung bedeutet, wenn Sie zählen los:
keine ref Zählung:
a = b;
ref Zählung:
if (a != null)
if (InterlockedDecrement(ref a.m_ref) == 0)
a.FinalRelease();
if (b != null)
InterlockedIncrement(ref b.m_ref);
a = b;
Auch Beachten Sie, dass es sich bei Technical Report 1 (TR1) um einen Entwurf für Artikel handelt, die in den C++ 0x-Standard aufgenommen werden sollen. Wenn C++ 0x näher kommt, werden diese sogar noch besser unterstützt (sie basieren auf der Boost-Bibliothek). –
Ich habe meine Zweifel an der Lock-Free-Implementierung, aber das ist wahrscheinlich immer noch die beste Wahl. Multi-Thread ist in C++ mit allen Tricks, die der Compiler an Ihrem Code machen kann, teuflisch schwer zu machen. –
Man ... Entweder fehlt mir etwas, oder irgendetwas stimmt nicht mit dieser Antwort ... Warum wurde es so oft akzeptiert und neu gewählt, wenn es nicht einmal die ursprüngliche Frage beantwortet - es deutet nur etwas an Sonst hat das bereits eine funktionierende Implementierung der gleichen Sache, die in OQ war? – Paulius