Dies ist eine zweiteilige Frage, die sich mit der Atomizität von std::shared_ptr:
1.
Soweit ich das beurteilen kann, std::shared_ptrist dies der einzige intelligente Zeiger <memory>, der atomar ist. Ich frage mich, ob es eine nicht-atomare Version von std::shared_ptrgibt (ich kann nichts darin sehen <memory>, daher bin ich auch offen für Vorschläge außerhalb des Standards, wie die in Boost). Ich weiß, boost::shared_ptrist auch atomar (wenn BOOST_SP_DISABLE_THREADSnicht definiert), aber vielleicht gibt es eine andere Alternative? Ich suche etwas, das die gleiche Semantik hat wie std::shared_ptr, aber ohne die Atomizität.
2. Ich verstehe, warum std::shared_ptratomar ist; es ist irgendwie nett Es ist jedoch nicht für jede Situation schön, und C ++ hat in der Vergangenheit das Mantra "Bezahlen Sie nur für das, was Sie verwenden". Wenn ich nicht mehrere Threads verwende oder wenn ich mehrere Threads verwende, aber den Zeigerbesitz nicht auf mehrere Threads teile, ist ein atomarer intelligenter Zeiger übertrieben. Meine zweite Frage ist, warum std::shared_ptrin C ++ 11 keine nichtatomare Version von bereitgestellt wurde . (vorausgesetzt, es gibt ein Warum ) (wenn die Antwort einfach "eine nichtatomare Version wurde einfach nie in Betracht gezogen" oder "niemand hat jemals nach einer nichtatomaren Version gefragt" lautet, ist das in Ordnung!).
Bei Frage Nr. 2 frage ich mich, ob jemand jemals eine nicht-atomare Version von shared_ptr(entweder Boost oder dem Standardkomitee) vorgeschlagen hat (nicht um die atomare Version von zu ersetzen shared_ptr, sondern um damit zu koexistieren), und sie wurde für eine abgeschossen bestimmter Grund.
shared_ptraufgrund seiner Atomizität eine erhebliche Verlangsamung darstellte und die Definition BOOST_DISABLE_THREADSeinen spürbaren Unterschied machte (ich weiß nicht, ob std::shared_ptrdie gleichen Kosten wie diese entstanden wären boost::shared_ptr).
shared_ptrIch kann keine Antwort schreiben, jetzt ist es geschlossen, also kommentieren.) Wenn Ihr Programm nicht mehrere Threads verwendet, werden bei GCC keine atomaren Operationen für die Nachzählung verwendet. Unter (2) unter gcc.gnu.org/ml/libstdc++/2007-10/msg00180.html finden Sie einen Patch für GCC, mit dem die nichtatomare Implementierung auch in Multithread-Apps für shared_ptrObjekte verwendet werden kann, die nicht gemeinsam genutzt werden Fäden. Ich habe jahrelang auf diesem Patch gesessen, aber ich denke darüber nach, ihn endlich für GCC 4.9