c++ multithreading boolean mutex openscenegraph

En una aplicación C++ multiproceso, ¿necesito un mutex para proteger un booleano simple?



multithreading openscenegraph (4)

¿Por qué no simplemente usar una variable entrelazada ?

Tengo una aplicación C ++ de subprocesos múltiples que hace una representación 3D con la biblioteca OpenSceneGraph. Estoy planeando iniciar el ciclo de renderización de OSG como un hilo separado usando boost :: hilos, pasando una estructura de datos que contiene un estado compartido al hilo. Estoy tratando de evitar cualquier cosa demasiado pesada (como mutexes) para la sincronización, ya que el bucle de renderizado debe ser bastante ajustado, y el mismo OSG intenta evitar tener que bloquear alguna vez. La mayor parte del estado compartido se establece antes de que se inicie el hilo, y nunca se cambia. Tengo algunos datos que necesitan ser cambiados, y estoy planificando un doble buffer. Sin embargo, tengo un booleano simple para señalar el hilo para suspender la representación, y luego reanudar el procesamiento, y otro para matarlo. En ambos casos, el hilo de la aplicación establece el bool, y el hilo de renderizado solo lo lee. ¿Necesito sincronizar el acceso a estos bools? Por lo que puedo decir, lo peor que puede pasar es que el bucle de render continúa para un marco adicional antes de suspender o cerrar.



No creo que necesite un mutex completo, aunque el hilo de renderizado tendrá que esperar ocupado en el estado ''suspendido'' si no está utilizando un objeto de sincronización que admita una primitiva de espera.

Sin embargo, debe considerar el uso de varias primitivas de intercambio entrelazadas (InterlockedExchange en Windows). No porque las lecturas / escrituras del bool no sean atómicas, sino para garantizar que no haya comportamientos raros a los que acceda la memoria de reordenamiento del compilador en un solo subproceso.


Tienes razón, en este caso no necesitarás sincronizar los bools. Sin embargo, debe declararlos volatile para asegurarse de que el compilador realmente los lea de memoria cada vez, en lugar de almacenar en caché la lectura anterior en un hilo (esta es una explicación simplificada, pero debería hacerlo para este propósito).

La siguiente pregunta tiene más información sobre esto: hilo de C ++, datos compartidos