Historique des modifications - Message

Message #1751

Sujet: [raknet] reseau simple sans serveur


TypeDateAuteurContenu
Création du message02-03-2007 20:36:51ptitfred
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

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
104 invités en ligne
membre en ligne: -
RSS Feed