[C/C++] Liste thread safe

Le côté programmation du développement d'un jeu vidéo.

Liste thread safe

Messagepar Rewpparo » 13 Nov 2009, 01:50

Bonjour,
J'essaie de faire une petite simulation de vaisseaux spatiaux, avec une physique réaliste. Mais j'ai un problème de design.
La façon dont je voyais les choses, j'avais un objet SystèmeSolaire, qui est un simple vecteur listant les objets présents dans la simulation (planètes, astéroides, vaisseaux...). J'avais prévu de faire un système de rendu dans un thread séparé, qui utiliserait les données de cette liste pour dessiner la simulation sur l'écran. J'avais prévu également un autre thread, pouvant travailler a une fréquence différente, qui ferait la physique pour déplacer les objets, en utilisant également SystèmeSolaire. j'avais prévu de greffer d'autres systemes dessus, SystèmeSolaire servant de centralisation des données, tout le monde travaillant sur la même instance qui serait le point de rencontre de tous les threads.

Mais j'ai un problème pour rendre SystèmeSolaire thread safe. Différents threads peuvent lire les données, ca STL le permet. Mais le problème est quand il s'agit d'ajouter ou de supprimer des objets. En effet, les threads travaillant sur SystèmeSolaire ne font en gros que parser la liste en continu, et effectuer leur travail sur chaque objet de la simulation. Donc j'ai en continu deux iterateurs ou plus qui parcourent la liste, avec une brève pause entre deux cycles. Si j'ajoute ou que je retire un objet de la liste, les itérateurs sont invalidés. Si je verouille un mutex avant de prendre un iterateur, et que je le déverouille une fois fini, ca veut dire qu'un seul thread peut travailler sur la liste a un moment donné, et je perd tout l'intéret de mes threads. Quand a pister les iterateurs pour faire les opérations a un moment ou il n'y en a aucun, ca ne sera pas vraiment viable dans la pratique car je compte en avoir plusieurs, sur des cycles décallés. donc il y a de bonnes chances pour qu'il y en ait toujours un qui travaille.

J'ai besoin que la liste que j'utilise permette a plusieurs threads de parcourir la liste a un moment donné, et aussi permettre a au moins un thread d'ajouter ou retirer des éléments de la liste pendant que d'autres la parcourent. Et j'ai besoin que la solution soit portable (minimum linux windows mac)

Existe-t-il une liste qui me permette cela ? Ou est-ce mon idée d'instance sur laquelle tout le monde travaille en même temps qui n'est pas praticable ? Comment fait on généralement dans un jeu ?
Avatar de l’utilisateur
Rewpparo
Hello World, I'm new !
 
Messages: 41
Inscription: 30 Nov 2007, 14:04
Localisation: La rochelle

Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 29 invités