thread lock example c++ c++11 memory-model

lock - mutex c++ example



¿Std:: mutex crea una cerca? (2)

Como entiendo esto está cubierto en:

1.10 Ejecuciones multihilo y carreras de datos.

Para 5:

La biblioteca de fi ne una serie de operaciones atómicas (Cláusula 29) y operaciones en mutexes (Cláusula 30) que están especialmente identificadas como operaciones de sincronización. Estas operaciones desempeñan un papel especial al hacer que las asignaciones en un hilo sean visibles para otro. Una operación de sincronización en una o más ubicaciones de memoria es una operación de consumo, una operación de adquisición, una operación de liberación o una operación de adquisición y liberación. Una operación de sincronización sin una ubicación de memoria asociada es una valla y puede ser una valla de adquisición, una valla de liberación o una valla de adquisición y de liberación. Además, hay operaciones atómicas relajadas, que no son operaciones de sincronización, y operaciones atómicas de lectura-modificación-escritura, que tienen características especiales. [Nota: Por ejemplo, una llamada que adquiera un mutex realizará una operación de adquisición en las ubicaciones que comprenden el mutex. En consecuencia, una llamada que libere el mismo mutex realizará una operación de liberación en esas mismas ubicaciones. De manera informal, realizar una operación de liberación en A hace que los efectos secundarios previos en otras ubicaciones de memoria se vuelvan visibles para otros subprocesos que luego realizan una operación de consumo o adquisición en A. Las operaciones atómicas "relajadas" no son operaciones de sincronización, aunque, como las operaciones de sincronización, no pueden contribuir a las carreras de datos. "Nota final"

Si bloqueo un std::mutex , ¿siempre obtendré una valla de memoria? No estoy seguro de si implica o obliga a obtener la cerca.

Actualizar:

Encontré esta referencia siguiendo los comentarios de RMF.

Programación multiproceso y visibilidad de memoria.


El desbloqueo de un mutex se sincroniza con el bloqueo del mutex. No sé qué opciones tiene el compilador para la implementación, pero obtienes el mismo efecto que una valla.