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?
- principal hilo de ejecución que maneja la entrada del usuario y pone en cola la base de datos escribe
- 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!
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
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
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