nicompx
Messages postés107Date d'inscriptionlundi 16 janvier 2006StatutMembreDernière intervention15 juillet 2009
-
3 oct. 2006 à 10:31
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 2014
-
4 oct. 2006 à 12:40
Salut,
Je démarre plusieurs thread qui exécute une fonction.
Cette fonction reçoit en paramètre une structure.
Si je passe l'adresse de la structure en paramètre à la fonction pthread_create, lorsque la thread sera exécuté (j'utilise des mutex, donc elle sont executées les une apres les autres), la fonction va utilisé la valeur actuelle de la structure et non pas la valeur du moment du lancement du thread.
=> J'aimerais passer la valeur de la structure en paramètre à la fonction pthread_create.
Comment faire???
Exemple :
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, &INSERT_LOG_PROCESS, Elem); //Accepte &Elem car (adresse), n'accepte pas la valeur Elem car (valeur)
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 3 oct. 2006 à 11:56
Dans ta fonction qui est executée dans le thread, il te suffit d'avoir une structure temporaire dans laquelle tu va recopier les informations contenus dans Elem. De cette facon tu ne vas pas modifier les valeurs contenues dans Elem
Si je rajoute un sleep dans la boucle qui lance les threads ca fonctionne, car le temps qu'il aie chercher la valeur en mémoire pour l'afficher, la valeur n'a pas encore été modifiée.
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 201419 4 oct. 2006 à 12:10
Le soucis est que tu utilises la même structure de données pour tous tes threads, parce que tu pars du principe que chaque thread est lancé dans l'ordre ou tu l'as demandé et tu pars également du principe que chaque thread va attendre que ceux qui ont été demandés avant lui ait lu la valeur de Elem.
Ca ne marche pas comme ça. L'ordonnanceur peut pour des raisons x ou y décider que le thread 2 soit lancé après le thread 3, ou même suspendre le thread 2 avant qu'il ne lise Elem, et faire passer le thread 3 pour qu'il le lise à la place de thread 2, etc...
L'ordre dans lequel tu demandes les thread (pthread_create) n'est pas nécessairement l'ordre que choisira l'ordonnanceur.
Le mieux est d'utiliser un tableau de paramètres
char *Elem[NTHREAD];
et de passer l'adresse de chaque cellule au thread approprié
Ainsi chaque thread possède son propre argument, dans une zone mémoire distincte, qui n'interfère pas avec les autres. Et quelquesoit l'ordre que choisira l'ordonnanceur, aucun thread ne sera géné par un autre.