Eu quero fazer aproximadamente isso:
Thread inicial:
- escreva alguns valores para vars globais (eles nunca serão escritos novamente)
- Podem ser dados moderadamente grandes (matrizes, strings, etc.). Não pode ser feito simplesmente
std::atomic<>
.
- Podem ser dados moderadamente grandes (matrizes, strings, etc.). Não pode ser feito simplesmente
- gerar outros tópicos
Outros tópicos:
- leia o estado global
- trabalha, etc.
Agora, eu sei que posso passar argumentos para std::thread
, mas estou tentando entender as garantias de memória do C ++ através deste exemplo.
Além disso, estou bastante confiante de que, em qualquer implementação do mundo real, a criação de um thread causará uma barreira de memória, garantindo que o thread possa "ver" tudo o que o thread pai escreveu até esse momento.
Mas minha pergunta é: isso é garantido pelo padrão?
Além disso: suponho que eu poderia adicionar um pouco mais std::atomic<int>
ou menos, e escrever nele antes de iniciar os outros threads, e nos outros threads, leia isso uma vez na inicialização. Acredito que todo o maquinário que acontece antes garantiria que o estado global previamente escrito seja adequadamente visível.
Mas minha pergunta é se algo assim é tecnicamente necessário ou a criação de threads é suficiente?
fonte
std::atomic<int>
... Você pode usarstd::atomic_thread_fence
.Respostas:
A criação de threads é suficiente. Há um ponto de sincronização entre o construtor do encadeamento e o início do novo encadeamento por [thread.thread.constr] / 7
Isso significa que todos os estados no segmento antes que o novo segmento seja gerado são visíveis para o segmento gerado.
fonte