Pregunta ¿Necesito un mutex para leer?


Tengo una clase que tiene un estado (una enumeración simple) y que se accede desde dos hilos. Para cambiar el estado, uso un mutex (boost :: mutex). ¿Es seguro verificar el estado (por ejemplo, comparar state_ == ESTABLISHED) o tengo que usar el mutex también en este caso? En otras palabras, ¿necesito el mutex cuando solo quiero leer una variable que podría ser escrita simultáneamente por otro hilo?


32
2017-10-06 12:05


origen


Respuestas:


Depende.

El lenguaje C ++ no dice nada sobre hilos o atomicidad.

Pero en más CPUs modernas, leer un número entero es una operación atómica, lo que significa que siempre leerá un valor constante, incluso sin un mutex.

sin embargoSin mutex ni ninguna otra forma de sincronización, el compilador y la CPU pueden reordenar lecturas y escrituras, de modo que cualquier cosa más compleja, cualquier cosa que implique el acceso a múltiples variables, sigue siendo insegura en el caso general.

Suponiendo que el subproceso de escritor actualiza algunos datos, y luego establece un indicador de entero para informar a otros subprocesos que los datos están disponibles, esto podría reordenarse para que se establezca el indicador antes de actualizar los datos. A menos que use un mutex u otra forma de barrera de memoria.

Entonces, si desea un comportamiento correcto, no necesita un mutex como tal, y no hay problema si otro hilo escribe en la variable mientras lo está leyendo. Será atómico a menos que estés trabajando en una CPU muy inusual. Pero tu hacer necesita una barrera de memoria de algún tipo para evitar el reordenamiento en el compilador o la CPU.


13
2017-10-13 14:37



Tienes dos hilos, intercambian información, sí, necesitas un mutex y probablemente también necesites una espera condicional.

En su ejemplo (compare state_ == ESTABLISHED) indica que el hilo # 2 está esperando que el hilo # 1 inicie una conexión / estado. Sin un mutex o condicionales / eventos, el hilo # 2 tiene que sondear el estado continuamente.

Threads se usa para aumentar el rendimiento (o mejorar la capacidad de respuesta), el sondeo generalmente resulta en una disminución del rendimiento, ya sea consumiendo una gran cantidad de CPU o introduciendo latencia debido al intervalo de sondeo.


9
2017-10-06 12:22



Sí. Si el hilo a lee una variable mientras el hilo b le escribe, puede leer un valor indefinido. La operación de lectura y escritura no es atómica, especialmente en un sistema multiprocesador.


3
2017-10-06 12:10



En términos generales, no lo hace, si su variable se declara con "volátil". Y SOLAMENTE si se trata de una sola variable, de lo contrario deberías tener mucho cuidado con posibles carreras.


0
2017-10-06 12:11



El acceso a la enumeración (lectura o escritura) debe ser protegido.

Otra cosa: Si la contención del hilo es menor y los hilos pertenecen al mismo proceso, entonces la sección crítica sería mejor que mutex.


0
2017-10-06 12:13



de hecho, no hay ninguna razón para bloquear el acceso al objeto para leer. solo quiere bloquearlo mientras escribe en él. esto es exactamente lo que es un bloqueo lector-escritor. no bloquea el objeto mientras no haya operaciones de escritura. mejora el rendimiento y evita los bloqueos. vea los siguientes enlaces para explicaciones más elaboradas:

wikipedia proyecto de código


0
2017-10-13 14:15