2010-04-02 8 views
6

Mi programa tiene dos hilos:¿Cómo puedo sincronizar el acceso a la base de datos entre un hilo de escritura y un hilo de lectura?

  1. principal hilo de ejecución que maneja la entrada del usuario y pone en cola la base de datos escribe
  2. Un hilo utilidad que se despierta cada segundo y elimina las escrituras en la base de datos

Dentro del hilo principal, ocasionalmente necesito hacer lecturas en la base de datos. Cuando esto sucede, el rendimiento no es importante, pero la corrección sí lo es. (En un mundo perfecto, estaría leyendo desde un caché, no haciendo un viaje de ida y vuelta a la base de datos, pero dejemos eso de lado por el bien de la discusión.)

¿Cómo me aseguro de que el hilo principal se vea? una base de datos correcta/inactiva?

Un mutex estándar no funcionará, ya que corro el riesgo de que el hilo principal tome el mutex antes de que los datos se descarguen a la base de datos. Esta sería una gran condición de carrera.

Lo que realmente quiero es algún tipo de mutex que permita que el hilo principal de ejecución proceda solo DESPUÉS de que el mutex haya sido capturado y liberado una vez. ¿Existe tal cosa? ¿Cuál es la mejor manera de resolver este problema?

ACTUALIZACIÓN: Después de hacer algunas investigaciones adicionales, podría usar Boost's Conditional Variable para solucionar este problema. O eso, o simplemente muerde la bala y guarda en caché mis escritos. ¡Gracias por la respuesta!

Respuesta

1

Si no tiene más de un hilo de ejecución principal (es decir, el único hilo que insertará escrituras en el hilo de trabajo es el mismo hilo que leerá de la base de datos), entonces probablemente solo pueda tener un la variable/función simple "pendiente escribe" que puede verificar antes de enviar un lea, y hágalo girar o espere una señal hasta que las escrituras se hayan purgado. Parece que no será necesario realizar ningún bloqueo o sincronización en las escrituras, si simplemente se pueden poner en cola para que sean procesadas por el hilo de trabajo.

Básicamente, siempre y cuando se le garantiza que en medio de la verificación de ese estado '' escrituras pendientes y cuando se ejecute la lectura, no hay escrituras, entonces usted no tiene que hacer nada demasiado lujoso.

3

Su solución propuesta seguramente todavía resulta en una condición de carrera, ya que una "escritura" puede entrar en cualquier momento, incluso a la mitad de un nuevo evento en cola.

Una solución que puede probar es el valor de estado de la base de datos atómica: realiza su procesamiento, luego compare con un valor de estado atómico para asegurarse de leer desde una base de datos que está en el mismo estado que cuando comenzó la lectura . Si es diferente, empiezas de nuevo. Esto puede estar sujeto a la inanición, pero eso es un problema aparte.

Cada vez que cambie la base de datos, debe comparar e intercambiar el valor del estado atómico que utilizó, lo que indica un cambio.

3

Varias soluciones son posibles:

  • Haga que cada hilo de abrir su propia conexión d/b y usarlo exclusivamente
  • uso de una sola conexión, pero tienen cada hilo posee el mutex para acceder a ella.

No veo ningún problema con la segunda opción. ¿Cuál es el daño de enrojecerse cuando no hay nada que enjuagar?

+0

No estoy seguro de que esto funcione. Si cada hilo tiene su propia conexión db, aún pueden acceder a la misma tabla en la base de datos. Nada protege el primer subproceso de acceder a datos obsoletos que aún no ha sido actualizado por el segundo subproceso. – Runcible

+0

La contención de acceso de escritura simultánea, así como de lectura y escritura, es una característica estándar de los administradores de bases de datos. Como la pregunta está etiquetada como mysql, no debería haber ningún problema. – wallyk

+0

Digamos que el hilo 1 pone en cola un INSERT a una tabla Foo. Luego, antes de que el Tema 2 se haya despertado y haya vaciado la escritura en la base de datos, el Tema 1 ejecuta una declaración SELECT en la tabla Foo. No hay conflicto de acceso, pero el Tema 1 sigue leyendo datos obsoletos. – Runcible

Cuestiones relacionadas