Historique des modifications - Message

Message #1751

Sujet: [raknet] reseau simple sans serveur


Type Date Auteur Contenu
Création du message 02-03-2007 20:36:51 ptitfred
L'accès au CPU se fait de la facon suivante :
Thread 1 ***-----*******-------------****--*******
Thread 2 ----****----------*********-----**----------

On ne maitrise pas le basculement entre chaque thread, c'est le système qui prend ces décisions.

Tout ce que tu sais c'est qu'une opération atomique ne sera pas interrompue.

Dans ton cas qu'est-ce que cela donne ?

Le thread 1 va boucler jusqu'à avoir initialiser les 98 pointeurs.

A chaque boucle il fait :
  • un test
  • une incrementation
  • la création d'un pointeur sur une nouvelle zone de mémoire
  • une affectation


La préemption (le basculement vers l'autre thread) peut se faire entre chaque étape.

Et donc le thread 2 peut reprendre son execution dans chacune de ses étapes.

Ce qui est important de vérifier est la cohérence des données. Si la préemption se fait entre les étapes 2 à 4 tu auras un problème : le compteur de pointeurs valides (nbr) aura augmenté sans que le nouveau pointeur n'ait été créé ou stocké dans le tableau. Ce qui aboutira "peut-etre" à une segmentation fault si tu atteints le dernier pointeur sans que celui-ci ait été initialisé. (ici pas de segmentation fault puisque tu affiches une valeur pointée sous forme d'entier, il y a toujours une valeur en mémoire, mais par contre ca ne sera pas la valeur attendue ! donc c'est un bug).

Tu repéreras les sections critiques en analysant le code qui amène à des états incohérents, instable dans ton vocabulaire. Ce sont des états intermédiaires, indispensables mais que l'on ne peut utiliser dans un autre contexte.

Une solution ici consisterait à faire l'initialisation et l'affectation avant l'incrémentation, comme ca tu seras sûr que le thread 2 n'accèdera pas à une zone mémoire non initialisée.

Enfin pour la question de la boucle n'oublie jamais comment fonctionne une boucle for. Ici tu as utilisé la syntaxe ultra classique qui consiste à balayer un tableau connaissant sa taille. Mais il ne faut pas oublier que la condition de fin (le deuxieme statement dans le for) est exécuté à chaque pas. Ce qui fait que nbr n'a pas à être fixe. Ceci peut être interessant pour des boucles complexes où les conditions de fins peuvent être influencées par l'exécution de la boucle, son contenu...

voilà voilà smile

fred

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
521 invités en ligne
membre en ligne: -
RSS Feed