hak5
Messages postés5Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention16 avril 2004
-
7 avril 2004 à 17:09
hak5
Messages postés5Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention16 avril 2004
-
8 avril 2004 à 09:28
salut a tous,
je developpe une appli faisant tourner 2 threads.
je synchronise mes deux thread grace a une variable globale : il y a un thread qui met a jour cette variable, tandiske l'autre thread attend la modif de cette variable.
J'ai pu lire dans un tutoriel API windows qu'il etait deconseillé d'attendre dans une boucle au sein d'un thread le changement d'etat d'une variable globale.
Que dois je faire pour booster mon appli ?
est il recommandé d'utiliser un mutex ?
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 7 avril 2004 à 18:39
ya des objets plus elaborés pr la synchronisation, genre les event. HANDLE evenement = CreateEvent(NULL,true,false,NULL);
et if (WaitForSingleObject(evenement,0) == WAIT_OBJECT_0)
pour tester l'etat de evenement (signalé ou non signalé)(SetEvent( ... ) permet de signaler un Event).
bref le prob cé ke 'evenement' doit etre une variable partagé par les 2 threads, mais la c'est pas un probleme, vu que WaitForSingleObject(evenement,0) se débrouille bien.
(le 0 correspond a un temps d'attente de 0ms, si tu mets 5000, ca va bloquer pdt 5 sec, et renvoyer WAIT_TIMEOUT si l'evenement a pas été signalé, et ca va bloquer pdt moins longtemps si entre temps tu le signales depuis l'autre thread, et la ca renvoie WAIT_OBJECT_O)
en gros kan t'as 2 threads, partager une variable (classique) ds laquelle un peu ecrire et l'autre lire n'est pas une bonne idée ! et qd les deux peuvent y ecrire, ca peu faire des resultats imprévus. (genre une incrementation ds chak thread, mé en meme temps peu conduire a une seule incrémentation de la var. globale)
en gros si le thread 2 veut attendre ke le thread 1 ait fé kek chose, ds le 2 tu mets WaitForSingleObject(evenement,INFINITE), et dans le 1 tu mets SetEvent(evenement) au moment ou le 2eme doit démarrer.
en mrelisant cé pas super clair du premier coup mais bon ;)