A geração de um thread fornece garantias de ordem de memória por conta própria?

20

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<>.
  • 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?

jwd
fonte
Suponho que poderia adicionar um boneco std::atomic<int>... Você pode usar std::atomic_thread_fence.
Rin Kaenbyou 26/02
@NathanOliver d'oh. comentário removido. Não posso contar quantas vezes você me ajudou aqui, não importa quão estúpidas minhas perguntas sejam ...
idclev 463035818 26/02/02
11
@ idclev463035818 Não se preocupe. Isso acontece com todos nós.
NathanOliver 26/02

Respostas:

26

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

Sincronização: A conclusão da chamada do construtor é sincronizada com o início da chamada da cópia de f.

Isso significa que todos os estados no segmento antes que o novo segmento seja gerado são visíveis para o segmento gerado.

NathanOliver
fonte