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 :
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à fred |
| Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
|---|---|---|---|---|
|
Préférences cookies Corrections |
![]() ![]() ![]() ![]() |
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 |