std :: atomic com classe customizada (C ++ 11)
Eu estou usando std :: atomic com uma classe personalizada na minha biblioteca. Tudo funciona bem com o MSVC, mas agora que estou tentando executá-lo no macOS, recebo um erro de vinculador:
símbolos indefinidos para a arquitetura x86_64: "__atomic_store", referenciado de: _main in main.o
Eu criei algum código de teste para replicar isso
#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;
}
É claro que este exemplo não faz muito sentido, mas é o mais curto que eu poderia fazer. Ele roda no VS2012, mas não no xcode (me dando o erro de linker mostrado acima).
Então o que está acontecendo? Estou abusando std :: atômica aqui? A biblioteca na qual estou trabalhando é altamente multithread e usada para processamento de áudio. Então, se eu não estou usando std :: atomic da maneira correta, ele não está realmente mostrando, porque o desempenho é muito bom e eu não tenho nenhum problema de encadeamento com ele. Ou o xcode talvez falte alguma coisa?
Atualizar:
Eu verifiquei a resposta de andrey porque ela tem mais informações, embora todas as 3 respostas sejam úteis. Eu não sou especialista nisso (obviamente), mas parece que o VS2012 vai além do que deve ser implementado em C ++ 11.
Então, como sair daqui? Eu vejo algumas opções.
Não use atômica para esta classe. No meu caso particular, isso seria muito difícil porque minha classe vetorial é usada em todo o código. Bloquear e desbloquear mutexes provavelmente atrasaria muito as coisas.Implementar as funções sozinho para atômica. Isso parece muito complicado para mim. Vou salvá-lo como a última opção.Veja se algo pode ser feito com boost :: atomic. Isso parece funcionar à primeira vista. Eu tenho que fazer mais testes sobre isso.