semaforos semaforo sem_wait programa libreria inicializar implementar crear binarios c++ multithreading mutex

c++ - semaforo - ¿Necesito un mutex para leer?



semaforos binarios en c (6)

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?


Depende.

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

Pero en la mayoría de las CPU 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 embargo , sin un mutex u otra forma de sincronización, el compilador y la CPU pueden reordenar lecturas y escrituras, por lo 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 hilo del escritor actualiza algunos datos, y luego establece un indicador entero para informar a otros hilos que los datos están disponibles, esto podría reordenarse para que el indicador se establezca 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 necesitas una barrera de memoria de algún tipo para evitar que se vuelva a ordenar el compilador o la CPU.


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 el mutex.


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.


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.


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.


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 codeproject wikipedia