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

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

undefined символы для архитектуры x86_64: "__atomic_store", на который ссылаются: _main в 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, возможно, не хватает чего-то?

Update:

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

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

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

Ответы

Ответ 1

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

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

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

Как насчет Boost.Atomic. Как описано в Boost.Atomic ограничения:

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

Ответ 2

Проверьте, какую стандартную библиотеку вы используете на странице проекта в настройках компилятора clang. Это должен быть GNU libstdС++ с поддержкой С++ 11 или libС++.

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