¿Generar un hilo proporciona garantías de orden de memoria por sí mismo?

20

Quiero hacer más o menos esto:

Hilo inicial:

  • escribir algunos valores en vars globales (nunca se volverán a escribir)
    • Esto podría ser datos moderadamente grandes (matrices, cadenas, etc.). No se puede hacer simplemente std::atomic<>.
  • generar otros hilos

Otros hilos:

  • leer el estado global
  • hacer trabajo, etc.

Ahora, sé que puedo pasar argumentos a std::thread, pero estoy tratando de entender las garantías de memoria de C ++ a través de este ejemplo.

Además, estoy bastante seguro de que en cualquier implementación del mundo real, la creación de un subproceso causará una barrera de memoria que garantiza que el subproceso puede "ver" todo lo que escribió el subproceso principal hasta ese momento.

Pero mi pregunta es: ¿está garantizado por la norma?

Aparte: supongo que podría agregar algo ficticio más std::atomic<int>o menos, y escribir en eso antes de comenzar los otros hilos, luego en los otros hilos, leer eso una vez al inicio. Creo que todo lo que sucede antes de la maquinaria garantizaría que el estado global previamente escrito sea visible de manera adecuada.

Pero mi pregunta es si algo así es técnicamente necesario, o ¿es suficiente la creación de hilos?

jwd
fuente
Supongo que podría agregar un muñeco std::atomic<int>... Puedes usarlo std::atomic_thread_fence.
Rin Kaenbyou
@NathanOliver d'oh. comentario eliminado No puedo contar con qué frecuencia me ayudaste aquí, no importa cuán estúpidas sean mis preguntas ...
idclev 463035818
1
@ idclev463035818 No se preocupe. Nos pasa a todos.
NathanOliver

Respuestas:

26

La creación de hilos es suficiente. Hay un punto de sincronización entre el constructor de subprocesos y el inicio del nuevo subproceso por [thread.thread.constr] / 7

Sincronización: La finalización de la invocación del constructor se sincroniza con el inicio de la invocación de la copia de f.

Esto significa que todo el estado del subproceso antes de que se genere el nuevo subproceso es visible para el subproceso generado.

NathanOliver
fuente