(de préférence boost) tableau / vecteur / carte / etc sans locking?

Compte tenu de mon manque de connaissances en c ++, essayez de lire mon intention et non ma mauvaise question technique.

C’est l’épine dorsale de mon programme https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp.

Je construis un serveur Websocket avec websocket ++ (et oh, c’est Websocket ++ sweet. Je le recommande vivement) et je peux facilement manipuler les données par utilisateur en toute sécurité, car elles n’ont pas besoin d’être manipulées par différents threads; Cependant, je veux pouvoir écrire dans un tableau (je vais utiliser le terme générique “tableau” de langages plus faibles comme vb, php, js) dans un fil de fonction (avec plusieurs itérations pouvant être en cours d’exécution). simultanément) et également lire dans 1 ou plusieurs threads.

Prenons l’exemple de la stack: si je voulais avoir tous les id (colonne PRIMARY de tous les articles) sortingés d’une manière particulière, dans ce cas par votes nets, et conservés en mémoire, je pensais avoir une fonction cela s’appelle dans son propre boost::thread , renvoyé chaque fois qu’un vote sur le site arrive pour réorganiser le tableau.

Comment puis-je faire cela sans locking et blocage? Je suis 100% bien avec les utilisateurs qui lisent un ancien tableau pendant qu’un autre est en construction, mais je ne veux absolument pas que leurs lectures ou les écritures de thread échouent / soient bloquées.

Existe-t-il un tableau sans locking? Sinon, y a-t-il un moyen de construire le nouveau tableau dans un tableau temporaire, puis de l’écrire dans le tableau réel lorsque la construction est terminée sans locking ni blocage?

Avez-vous consulté Boost.Lockfree ?

UH uh uh. Compliqué.

Regardez ici (pour un exemple): RCU – et il ne s’agit que de lectures multiples avec ONE write.

Je suppose que plusieurs écrivains à la fois ne vont pas au travail. Vous devriez plutôt rechercher une représentation plus efficace qu’un tableau, qui permet des mises à jour plus rapides. Que diriez-vous d’un arbre équilibré? log (n) ne doit jamais bloquer quoi que ce soit de manière perceptible.

En ce qui concerne boost – je suis heureux qu’il dispose enfin du support approprié pour la synchronisation des threads.

Bien sûr, vous pouvez également conserver une copie et regrouper les mises à jour. Ensuite, un processus en arrière-plan fusionne les mises à jour et copie le résultat pour les lecteurs.