Pregunta

Tengo una aplicación C ++ multiproceso que contiene una estructura de datos compleja en la memoria (datos en caché).

Todo es genial mientras acabo de leer los datos. Puedo tener tantos hilos como quiera para acceder a los datos.

Sin embargo, la estructura en caché no es estática.

  • Si el elemento de datos solicitado no está disponible, se leerá de la base de datos y luego se insertará en el árbol de datos. Esto probablemente tampoco sea problemático e incluso si uso un mutex mientras agrego el nuevo elemento de datos al árbol que solo tomará unos pocos ciclos (solo agrega un puntero).
  • Hay un proceso de recolección de basura que se ejecuta de vez en cuando. Elimina todos los elementos antiguos del árbol. Para hacerlo, necesito bloquear todo para asegurarme de que ningún otro proceso esté accediendo a los datos que se eliminarán de la memoria. También tengo que bloquear el árbol mientras leo del caché para que no elimine elementos mientras se procesan (algo así como "al revés").

" Pseudocódigo " ;:

function getItem(key)
   lockMutex()
   foundItem = walkTreeToFindItem(key)
   copyItem(foundItem, safeCopy)
   unlockMutex()
   return safeCopy
end function

function garbageCollection()
   while item = nextItemInTree
      if (tooOld) then
         lockMutex()
         deleteItem(item)
         unlockMutex()
      end if
   end while
end function

Lo que me molesta: Esto significa que tengo que bloquear el árbol mientras estoy leyendo (para evitar que la recolección de basura se inicie mientras leo). Sin embargo, como efecto secundario, ya no puedo tener dos procesos de lectura al mismo tiempo.

¿Alguna sugerencia?

¿Hay algún tipo de " esta es una acción de solo lectura que solo colisiona con las escrituras " Mutex?

¿Fue útil?

Solución

Busque lectura-escritura-bloqueo .

No especificó qué marco puede usar, pero ambos pThread y boost ha implementado ese patrón.

Otros consejos

El concepto es un " lector compartido, un solo escritor " como han dicho otros. En entornos Linux, debería poder utilizar pthread_rwlock_t Sin marco alguno. Sugeriría buscar en boost :: shared_lock también.

Sugiero un bloqueo de lector-escritor . La idea es que puede adquirir un bloqueo para " leer " o para " escribir " ;, y el bloqueo permitirá varios lectores, pero solo un escritor. Muy práctico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top