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С++.
Надеюсь, что это поможет.