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<>
.
- Esto podría ser datos moderadamente grandes (matrices, cadenas, etc.). No se puede hacer simplemente
- 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?
fuente
std::atomic<int>
... Puedes usarlostd::atomic_thread_fence
.Respuestas:
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
Esto significa que todo el estado del subproceso antes de que se genere el nuevo subproceso es visible para el subproceso generado.
fuente