|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
Bonsoir,
Dans une boucle, je crée plusieurs Threads pointant sur une même fonction. Or une des variable de cette fonction est écrasée lors du 2eme appel de cette fonction. Je me retrouve avec 2 fois le même résultat au lieu de 2 différents. J'ai mis en place une section critique comme je l'ai lu à plusieurs endroits, mais rien n'y fait. Y aurait-il quelque chose que je n'aurais pas compris ? Voila mon code : Code :
Code :
|
||||
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
Le code est étonnamment compliqué pour ce qu'il est censé faire (?)
En C++11, il existe std::thread. http://en.cppreference.com/w/cpp/thread/thread En C++ sinon, il y a boost::thread. OpenMP peut être aussi intéressant. As-tu fait un affichage avant la modification par les threads de lO_ThreadParam->sO_Trt (pour vérifier que la valeur est bien modifiée) ? As-tu fait un affichage juste après être entré et juste avant de sortir de la section critique (en augmentant la durée du calcul à l'intérieur avec un sleep(10)) pour être sûr qu'elle soit respectée ? |
|
|
00
|
|
|
#3 | ||
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
Qu'entends-tu par étonnamment long ?
Citation:
Citation:
|
||
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Étudiant Inscription : juin 2012 Messages : 263 ![]() |
C'est pas vraiment la longueur le soucis, c'est plutôt le fait de faire un code non portable alors que le C++ fourni tout ce qu'il faut pour faire ça simplement, de manière portable (std::thread depuis C++11, boost::thread avant)
Sinon pour ton problème, tu n'envoi que l'adresse de la structure qui contient tes params à tes threads. Tu n'as donc q'un seul objet ThreadParam existant, et tous les threads ont forcément les mêmes paramètres. |
|
|
01
|
|
|
#5 |
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
|
|
|
00
|
|
|
#6 | |
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
Citation:
On ne peut pas envoyer autre chose qu'un pointeur à Createthread... |
|
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
|
|
|
00
|
|
|
#8 | ||
|
Membre éprouvé
![]() Étudiant Inscription : juin 2012 Messages : 263 ![]() |
Utilise un tableau (si cI_NbTrt est une constante de compilation), un vector sinon.
Code :
|
||
|
|
10
|
|
|
#9 | ||
|
Membre Expert
![]() ![]() Inscription : mai 2008 Messages : 937 ![]() |
Vu qu'un thread met un peu de temps avant de se lancer il est très probable que la boucle for soit déjà terminée lorsque les ci_Nbtr threads démarrent pour de bon en appelant la fonction ThreadLauncher, et comme ils prennent tous en paramètre un pointeur vers la même structure sO_ThreadParam, ils partagent tous le même champ sO_Trt.
Il faut remplacer cette structure par un tableau et donner au ième thread l'adresse de la ième structure Autre chose, je ne sais pas trop quel est le but recherché avec tous ces threads mais dans le code montré ils ne servent à rien du tout. Comme la fonction ThreadLauncher est protégé par un mutex, tous les thread vont attendre un par un que le mutex se libère et la fonction TrtThread () va être appelé à tour de rôle, exactement comme si on avait écrit : Code :
|
||
|
|
10
|
|
|
#10 | |||
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
Citation:
Au final la section critique n'apportait rien, je l'ai donc enlevée. Concernant la portabilité de mon code, je vais m'attacher à faire attention. Merci à tous.
|
|||
|
|
00
|
|
|
#11 | |||
|
Membre éprouvé
![]() Étudiant Inscription : juin 2012 Messages : 263 ![]() |
Citation:
)Code :
|
|||
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
|
|
|
00
|
|
|
#13 | ||
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
Voici une utilisation de std::thread et std::mutex
Avec une fonction et une lamda_function (juste pour l'exemple) Code :
|
||
|
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : juillet 2004 Messages : 112 ![]() |
Ok merci pour le code.
Je garde ca sous le coude pour des jours meilleurs !!!! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com