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?
std::atomic<int>
... Puedes usarlostd::atomic_thread_fence
.