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_ptrbibliothek, 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_ptras @ -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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage