Dies ist eine zweiteilige Frage, die sich mit der Atomizität von std::shared_ptr
:
1.
Soweit ich das beurteilen kann, std::shared_ptr
ist dies der einzige intelligente Zeiger <memory>
, der atomar ist. Ich frage mich, ob es eine nicht-atomare Version von std::shared_ptr
gibt (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_ptr
ist auch atomar (wenn BOOST_SP_DISABLE_THREADS
nicht 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_ptr
atomar 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_ptr
in 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_ptr
aufgrund seiner Atomizität eine erhebliche Verlangsamung darstellte und die Definition BOOST_DISABLE_THREADS
einen spürbaren Unterschied machte (ich weiß nicht, ob std::shared_ptr
die gleichen Kosten wie diese entstanden wären boost::shared_ptr
).
shared_ptr
Ich 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_ptr
Objekte 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