Threads : partage de variable globale, fin de threads

Soyez le premier à donner votre avis sur cette source.

Vue 8 976 fois - Téléchargée 2 814 fois

Description

Juste un petit programme de test qui ouvre 5 threads affichant chacun une boite de dialogue modale avec un bouton. 4 thread se partagent une variable globale de type char * à laquelle il concatene leur noms à leurs fermeture. Le dernier thread (SuperThread) permet de fermer tout les threads ouverts (un peu brutalement c vrai, mais ca fonctionne).

Conclusion :


C'est juste un petit code pour tester les threads afin de mieux comprendre leur fonctionnement.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

ymca2003
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8 -
Salut, quelques petites remarques :

la ligne :
while(!terminer);

qui sert à attentre que le "super thread " soit terminé est à proscrire.
- tout d'abord, cette instruction consomme quasiment 100% du CPU pour rien.
- ensuite, cela ne marche pas en mode release a cause des optimisations.

en mode Debug, la variable est évaluée à chaque while mais en mode release, elle est évaluée une fois au début et puis c'est tout. On obtient une boucle sans fin (suffit de regarder le code assembleur généré) :

004010E8 : mov al,BYTE PTR[terminer]
004010ED : test al,al <---- test une seule fois au début
004010EF : jne 004010F3
004010F1 : jmp 004010F1 <---- boucle sans fin
004010F3 : ...

pour éviter la boucle sans fin, il suffit de déclarer la variable "terminer" en tant que "volatile" :
volatile bool terminer;
cette technique marchera en mode Release mais consomera toujours le CPU. code généré :
004010E8 : mov al,BYTE PTR[terminer]
004010ED : test al,al
004010EF : jne 004010F3
004010F1 : mov al,BYTE PTR[terminer]
004010F6 : test al,al <---- test à chaque boucle
004010F8 : jmp 004010F1
004010EF : ...

La meilleur technique pour attendre q'un thread se termine tout seule est:
WaitForSingleObject(hThread,INFINITE) qui n'utilise pas le CPU.
Cependant, si le thread que l'on attent utilise "SendMessage" pour envoyer un message à une fenêtre du thread qui attend, il y a un risque de DeadLock (le message ne sera pas traité car le thread censé le géré est en attente et le thread qui a envoyé le message attendra que le message soit traité). D'où tout le monde s'attend.


Ta variable CRITICAL_SECTION ne sert à rien (tu ne l'utilise pas). une utilisation possible serait à chaque fois que du manipule la variable texte:
EnterCriticalsection(&Sync);
strcat(texte,"....");
LeaveCriticalSection(&Sync);

Cela empêchera 2 threads différents de manipuler "texte" au même moment.

Cependant, on utilisant cette technique, TerminateThread est à proscrire car il risque d'interrompre le thread pendant qu'il est dans une section critique qui ne sera jamais relâchée.

Pour éviter d'utiliser TerminateThread, il suffit de poster un message aux boîtes de dialogues pour les fermer:
PostMessage(hDlg, WM_COMMAND,IDC_QUITTER,0);

puis d'attendre que les threads se terminent avec WaitForMultipleObject.


Conclusion : la synchronisation des threads n'est pas aisée, il faut savoir ce qu'il font à tout moment pour éviter des DeadLock.

pour en savoir plus sur les threads : JR4.zip
http://perso.wanadoo.fr/persans-brunews/brunews/download.htm
Oeil_de_taupe
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009
-
Petite question pour ymca2003, penses-tu que dans le cas de la boucle "while(!terminer);" remplacer la variable "bool" par une "bool volatile" ferait marcher le programme en mode release?

Cependant je suis d'accord avec toi, il faut mettre un "Sleep" dans le boucle pour ne pas prendre 100% du CPU ou mettre un WaitForObject avec un timeout, toutes les 500 ms par exemple, afin de récupérer d'éventuels messages.
cs_swonder
Messages postés
6
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
4 mai 2009
-
Bien que ma réponse est trés tardive, je suis entièrement d'accord avec le commentaire de ymca2003. J'ai fait de la façon qu'il a indiqué peu de temps aprés avoir diffusé ce source.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.