GCC atomic shared_ptr реализация

В соответствии сhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=57250, GCC 4.9 имеет поддержку атомарногоshared_ptr операции.

Используя GCC 4.9.2, я могу скомпилировать программу, которая использует атомарныйshared_ptr,-mcx16 требуется флаг, поскольку реализация GCC на x86_64, очевидно, требуетcmpxchg16b, что имеет смысл, так как я предполагаю, что атомная операция наshared_ptr потребует атомарного обновления как самого указателя, так и количества ссылок одновременно.

Тем не менее, когда я пытаюсь на самом делеиспользование атомныйshared_ptr библиотека, она не ведет себя так, как я ожидаю. Таким образом, либо я не использую это должным образом, либо реализация GCC неисправна. Большую часть времени я был бы уверен на 99%, что я делаю это неправильно, но так как это относительно новая функция и поведение кажется таким странным, я только на 50% уверен, что это моя вина в этом. дело.

Вот простая программа, которая создает атомнуюshared_ptrзатем выполняет серию одновременных операций чтения и записи в shared_ptr:

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;
}

Когда я компилирую и запускаю, вывод:

~$ 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

Но этот вывод не имеет смысла для меня. Во-первых, после инициализации атомногоshared_ptr&nbsp;до значения10, когда я загружаю его и читаю начальное значение (до того, как появятся какие-либо потоки), я получаю0, Во-вторых, после того, как все потоки объединяются, значение по-прежнему0хотя ни один поток не мог бы установить его0, И самое странное, что после присоединения потоковuse_count()&nbsp;из shared_ptr есть0! И все же атомнаяshared_ptr&nbsp;объект все еще находится в области видимости, и, следовательно, счетчик использования должен быть1.

Я почти уверен, что реализация GCC здесь несовершенна, но согласно ссылке, которую я разместил выше, GCC 4.9 имеет законченный атомарныйshared_ptr&nbsp;реализация и ...

~$ gcc --version
~$ gcc (Debian 4.9.2-10) 4.9.2

Итак ... что именно здесь происходит? Я хотел бы получить какое-то подтверждение того, что либо реализация GCC 4.9.2 здесь ошибочна, либо неполна, либо я просто совершенно ошибаюсь / не понимаю, как использовать атомарныйshared_ptr.