Considerar:
void foo() {
std::vector<std::atomic<int>> foo(10);
...
}
O conteúdo de foo agora é válido? Ou preciso fazer um loop explicito e inicializá-los? Eu verifiquei Godbolt e parece bom, no entanto, o padrão parece estar muito confuso neste ponto.
O construtor std :: vector diz que insere instâncias inseridas por padrão de std::atomic<int>
, cujo valor é inicializado via veiculação new
.
Eu acho que esse efeito de inicialização de valor se aplica:
2) se T é um tipo de classe com um construtor padrão que não é fornecido nem excluído pelo usuário (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou com padrão), o objeto é inicializado com zero e, em seguida, é inicializado por padrão se tiver um construtor padrão não trivial;
Portanto, parece-me que os átomos são zero-inicializados. Portanto, a questão é: a inicialização zero de um std::atomic<int>
resultado em um objeto válido?
Vou adivinhar que a resposta é "sim na prática, mas não está realmente definida"?
Nota: Esta resposta concorda que foi inicializada com zero, mas não diz se isso significa que o objeto é válido.
atomic_init
. Você já tem para sincronizar em torno do código em questão de qualquer maneiraMesmo que o construtor padrão tenha sido chamado (não é, porque é trivial), ele realmente não faz nada .
Obviamente, a inicialização zero não pode garantir um atômico válido; isso só funcionará se por acaso um atômico válido for criado, inicializando zero todos os seus membros.
E, como os átomos não são copiáveis, você não pode fornecer um valor de inicialização no construtor de vetores.
Agora você deve percorrer o contêiner e
std::atomic_init
cada elemento. Se você precisar bloquear isso, tudo bem, porque você já está sincronizando a criação do vetor pelo mesmo motivo.fonte