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.
Итак, как отсюда идти? Я вижу несколько вариантов.
- не используйте atomic для этого класса. В моем конкретном случае это было бы очень сложно, потому что мой векторный класс используется по всему коду. Блокировка и разблокировка мьютексов, вероятно, сильно замедлит процесс.
- выполнить функционирует сам для atomic. По-моему, это очень сложно. Я сохраню его как последний вариант.
- посмотрите, можно ли что-то сделать с 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++.
надеюсь, это поможет.