std:: atomic с пользовательским классом (C++ 11)

Я использую std:: atomic с пользовательским классом в моей библиотеке. Все отлично работает с MSVC, но теперь, когда я пытаюсь запустить его на macOS, я получаю ошибку компоновщика:

неопределенные символы для архитектуры x86_64: "__atomic _ store", ссылка из: _main в главном.o

Я создал тестовый код для репликации этого

#include <iostream>
#include <atomic>

using namespace std;

class Vec {
    public:
    int x, y, z;
    Vec() { x = y = z = 0; }
};

std::atomic<Vec> x;


int main()
{
  Vec a;
  x = a;
  cin.get();
    return 0;
}

конечно, этот пример не имеет большого смысла, но это самое короткое, что я мог придумать. Он работает в VS2012, но не в xcode (давая мне ошибку компоновщика, показанную выше).

что происходит? Я злоупотребляю std:: atomic здесь? Библиотека, над которой я работаю, сильно многопоточна и используется для обработки звука. Поэтому, если я не использую std::atomic правильным образом, он действительно не отображается, потому что производительность очень хорошая, и у меня нет проблем с потоками. Или xcode, возможно, чего-то не хватает?

обновление:

Я проверил ответ Андрея, потому что он имеет наибольшую информацию, хотя все 3 ответа полезны. Я не эксперт в этом (очевидно), но кажется, что VS2012 выходит за рамки того, что должно быть реализовано в C++11.

Итак, как отсюда идти? Я вижу несколько вариантов.

  1. не используйте atomic для этого класса. В моем конкретном случае это было бы очень сложно, потому что мой векторный класс используется по всему коду. Блокировка и разблокировка мьютексов, вероятно, сильно замедлит процесс.
  2. выполнить функционирует сам для atomic. По-моему, это очень сложно. Я сохраню его как последний вариант.
  3. посмотрите, можно ли что-то сделать с boost::atomic. На первый взгляд это работает. Я должен сделать больше тестов.

2 ответов


Как описано в http://en.cppreference.com/w/cpp/atomic/atomic:

стандартная библиотека предоставляет полную специализацию std:: atomic шаблон для следующих типов:

1) одна специализация для типа bool и его typedef
2) Специализации и typedefs для интегральных типов
3) std:: atomic для всех типов указателей

насчет импульс.Атомный. Как описано в импульс.Атомные ограничения:

использование не-POD-классов в качестве параметра шаблона для атомарных результатов в неопределенное поведение.


проверьте, какую стандартную библиотеку вы используете в страница проекта на настройки компилятора clang. Это должен быть libstdc++ GNU с поддержкой c++11 или libc++.

надеюсь, это поможет.