Question

J'ai une application C ++ multithread qui contient une structure de données complexe en mémoire (données mises en cache).

Tout va bien pendant que je lis les données. Je peux avoir autant de threads que je veux pour accéder aux données.

Cependant, la structure en cache n'est pas statique.

  • Si l'élément de données demandé n'est pas disponible, il sera lu dans la base de données, puis inséré dans l'arbre de données. Ce n’est probablement pas non plus un problème et même si j’utilise un mutex pendant que j’ajoute le nouvel élément de données à l’arbre, cela ne prend que quelques cycles (c’est simplement l’ajout d’un pointeur).
  • Un processus de récupération de place est exécuté de temps en temps. Il supprime tous les anciens articles de l'arbre. Pour ce faire, je dois tout verrouiller pour m'assurer qu'aucun autre processus n'accède actuellement à des données qui seront supprimées de la mémoire. Je dois également verrouiller l'arbre pendant la lecture de la mémoire cache afin de ne pas supprimer les éléments pendant leur traitement (genre de "même chose dans le sens inverse").

"Pseudocode":

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

Ce qui me dérange: cela signifie que je dois verrouiller l’arbre pendant que je lis (pour éviter que la collecte des ordures ne commence pendant que je lis). Cependant, comme effet secondaire, je ne peux plus avoir deux processus de lecture en même temps.

Des suggestions?

Y a-t-il une sorte de "Ceci est une action en lecture seule qui n'entre en collision qu'avec des écritures" Mutex?

Était-ce utile?

La solution

Recherchez le verrou en lecture / écriture .

Vous n'avez pas spécifié le framework que vous pouvez utiliser mais les deux pThread et boost ont implémenté ce modèle.

Autres conseils

Le concept est un verrou "lecteur partagé, écrivain unique" comme d'autres l'ont déjà indiqué. Dans les environnements Linux, vous devriez pouvoir utiliser pthread_rwlock_t sans cadre. Je suggérerais de rechercher boost :: shared_lock également.

Je suggère un verrou lecteur-écrivain . L’idée est que vous pouvez acquérir un verrou pour "lire". ou pour "écriture", et le verrou permettra à plusieurs lecteurs, mais un seul auteur. Très pratique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top