GCC atomic shared_ptr Implementierung
Gemäßhttps: //gcc.gnu.org/bugzilla/show_bug.cgi? id = 57250, GCC 4.9 unterstützt atomicshared_ptr
Operationen.
it GCC 4.9.2 kann ich ein Programm kompilieren, das atomic @ verwendeshared_ptr
. Das-mcx16
flag ist erforderlich, da die GCC-Implementierung auf x86_64 anscheinend @ erfordecmpxchg16b
, was Sinn macht, da ich davon ausgehen würde, dass eine atomare Operation auf einemshared_ptr
würde eine atomare Aktualisierung sowohl des Zeigers selbst als auch des Referenzzählers zur selben Zeit erfordern.
Allerdings, wenn ich versuche, tatsächlichverwende the atomicshared_ptr
bibliothek, es verhält sich nicht so wie ich es erwarte. Entweder verwende ich dies nicht richtig oder die GCC-Implementierung ist fehlerhaft. Die meiste Zeit bin ich zu 99% davon überzeugt, dass ich es einfach falsch mache, aber da dies eine relativ neue Funktion ist und das Verhalten so bizarr erscheint, bin ich nur zu 50% davon überzeugt, dass ich daran schuld bin Fall
Hier ist ein einfaches Programm, das ein atomares @ erstelshared_ptr
führt dann eine Reihe von gleichzeitigen Lese- und Schreibvorgängen auf dem shared_ptr durch:
void test()
{
std::atomic<std::shared_ptr<int>> p(std::shared_ptr<int>(new int(10)));
std::cout << "Use count : " << p.load().use_count() << std::endl;
std::cout << "Initial value of p : " << *(p.load()) << std::endl;
std::vector<std::thread> threads;
const std::size_t num_threads = 8;
for (std::size_t i = 0; i != num_threads; ++i)
{
threads.emplace_back([&p, i](){
std::shared_ptr<int> x = p.load();
while (!p.compare_exchange_weak(
x,
std::shared_ptr<int>(new int(i + 5))
)) ;
});
}
for (auto& t : threads) t.join();
std::cout << "Use count : " << p.load().use_count() << std::endl;
std::cout << "Final value of p : " << *(p.load()) << std::endl;
}
Wenn ich kompiliere und starte, ist die Ausgabe:
~$ g++ test2.cpp -o test2 -std=c++11 -lpthread -mcx16
~$ ./test2
Use count : 1
Initial value of p : 0
Use count : 0
Final value of p : 0
Aber diese Ausgabe macht für mich keinen Sinn. Erstens, nach der Initialisierung des atomarenshared_ptr
bis zu einem Wert von10
, wenn ich es lade und den Anfangswert lese (bevor irgendwelche Threads erzeugt werden), erhalte ich ein0
. Zweitens ist der Wert nach dem Verbinden aller Threads immer noch0
, obwohl kein Thread es möglicherweise auf @ gesetzt haben könn0
. Und am seltsamsten, nachdem die Threads sich verbinden, dieuse_count()
des shared_ptr ist0
! Doch das atomareshared_ptr
as @ -Objekt befindet sich noch im Gültigkeitsbereich und daher sollte die Nutzungsanzahl @ sei1
.
Ich bin mir ziemlich sicher, dass die GCC-Implementierung hier fehlerhaft ist, aber laut dem Link, den ich oben gepostet habe, hat GCC 4.9 ein vollständiges atomaresshared_ptr
Implementierung und ...
~$ gcc --version
~$ gcc (Debian 4.9.2-10) 4.9.2
So ... was genau ist denn hier los? Ich möchte eine Bestätigung erhalten, dass entweder die GCC 4.9.2-Implementierung hier fehlerhaft oder unvollständig ist, oder ich bin einfach total falsch / verwirrt über die Verwendung von atomicshared_ptr
.