2010-01-19 17 views
5

¿Necesito un mutex si tengo solo un lector y un escritor? El lector toma el siguiente comando (food.front()) de la cola y ejecuta una tarea basada en el comando. Después de que se ejecuta el comando, aparece el comando. El escritor en la cola empuja los comandos a la cola (food.push()).¿Mutex o no a Mutex?

¿Necesito un mutex? Mi lector (consumidor) solo se ejecuta si food.size() > 0. Estoy usando un hilo de lectura y envío de hilo.

+1

¿Qué contenedor está utilizando para lo anterior? –

+0

@Timo: 'queue food;' –

Respuesta

10

Un mutex se utiliza en entornos de subprocesos múltiples. No veo mención de hilos en su pregunta, así que no veo la necesidad de un mutex.

Sin embargo, si asumimos por el lector y escritor que significa que tiene dos hilos, es necesario proteger los datos de inversión con un mutex (u otro sistema de multi-hilo de protección.)

Lo que ocurre cuando la cola tiene artículos , y el hilo del lector muestra algo mientras el hilo del escritor pone algo? ¡Desastre! Con un mutex, estará seguro de que solo un hilo está operando en la cola a la vez.

Otro método es una cola segura sin hilos de bloqueo. Utilizaría operaciones atómicas para garantizar que los datos no se manipulen de forma incorrecta.

+0

La pregunta está etiquetada 'multiproceso' –

+1

@John: Ah, normalmente no observo las etiquetas, mi mal. – GManNickG

+0

@GManNickG: ¿Qué quiere decir con "cola libre de subprocesos seguro de subprocesos". ¿Una que construyo de acuerdo a mis necesidades? ¿O hay tal cosa en el STL? – steffen

1

¿Qué sucede si el lector ve que el tamaño es mayor que cero, pero la estructura aún no está completamente actualizada?

Esto se puede evitar codificando cuidadosamente las actualizaciones, pero la forma de hacer que el código sea resistente a las futuras alteraciones de consiste en utilizar un mutex.

+1

Y si estamos hablando de la ejecución en una arquitectura multiprocesador/multi-core, "codificar cuidadosamente las actualizaciones" significa usar las barreras de memoria correctas en los lugares correctos, que es un dolor de cabeza. –

1

Suponiendo que el "escritor" y el "lector" son en hilos separados:

Lo más probable es que sí: Usted podría tener un estado "metaestable" entre el evento "escrito" y un evento de "lectura", donde los punteros a las estructuras son consistentes.

Por supuesto, esto depende de la implementación: si se utiliza una operación atómica para actualizar los punteros, puede que sea bueno sin un mutex.

1

Depende totalmente de la implementación, si tiene dos subprocesos diferentes que acceden a las mismas variables, necesitará un mutex. De lo contrario, puede, por ejemplo, terminar con un conteo inconsistente.

Diga en escritura que hace ++ cuenta y en lectura lo hace --cuénte y diga que el valor actual es 2. Ahora tenga en cuenta que estas afirmaciones no necesitan ser atómicas, el recuento ++ puede consistir en leer el conteo de variables , incrementándolo y luego escribiéndolo nuevamente. Ninguna escritura y lectura se ejecutan simultáneamente y dicen que se ejecuta el primer bit de la escritura (es decir, que carga el valor 2. luego se ejecuta la lectura completa decrementando el recuento, pero el otro subproceso todavía tenía el valor 2 cargado, que aumenta y posteriormente se vuelve a escribir en la variable Ahora que acaba de perder una acción de lectura

0

su pregunta depende de dos condiciones:..

  1. sólo hay dos hilos, uno es el productor, el otro es el consumidor
  2. la estructura está diseñada para libre de bloqueo

si satisface ambos, puede soltar el bloqueo o necesita usar un bloqueo para proteger la estructura de la cola.
para soltar el candado, debe recordar actualizar el puntero del encabezado o tailer al final de los pasos.