IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

problème d'exécution concurrente


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut problème d'exécution concurrente
    Bonjour,
    dans un programme j'utilise des threads, aucunne erreur de compilation ou quoi que ce soit, mais j'ai le problème suivant:

    mon processus principal lit un fichier ligne par ligne, une fois la ligne obtenue, un thread va la traiter. Seulement, la procédure associée au thread reçoit apparemment la dernière ligne du fichier à chaque fois...

    en effet, pour un fichier de 3 lignes par exemple, si je teste la valeur de chaque ligne avant de passer la ligne en arguments, les 3 lignes ont bien été lues.

    Dans la procédure de l'argument si je demande qu'il m'imprime successivement toutes les lignes qu'elle reçoit, elle m'affichera 3 fois la ligne numéro 3.

    Mon code est le suivant, rien d'exeptionnel..

    au niveau de l'envoi de la ligne lue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
            <...>      
     
    	while(fgets(line,256,f)!= NULL)
    	{
    		/* traitement de la ligne, lancement du premier groupe de threads (un seul pour l'instant) */
    		printf("ligne envoyée 1 = %s", line);
    		pthread_create( &tid[cpt], NULL, lecture_aux, (void*)line);	
    		cpt++;
    	}
     
     
             <...>

    au niveau de la réception de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void* lecture_aux(void * line){
    	char* path = (char*) line; /* recuperation de l'argument */
    	FILE *f;
    	int i,size;
    	char *fileName; /* cope de path sans '\n' ni buffer vide après */
     
    	printf("ligne recue = : %s\n",path);
     
           <...>

    mes threads se terminent bien, le problème ne devrait pas venir de là.
    Les threads ayant parcontre en commun le même code que le processus principal, le problème ne viendrait-il pas de là?

    J'espere avoir été clair dans mes explications.

    D'avance je vous remercie

  2. #2
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Salut,

    Le problème ne viendrait-il pas du fait que la variable line est partagée par les threads ? Et comme ta boucle while continue à lire les lignes suivantes (stockées à l'adresse que tu as passée à ton thread)...

    Peut-être faudrait-il passer à ton thread une copie de la ligne.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    enfait, à mon sens, le pointeur étant une zone de mémoire allouée, elle est la même pour chaque thread, donc en effet si j'appelle une procédure x avec un pointeur pointant vers une zone mémoire, et que dans un autre thread, je modifie le contenu de cette zone mémoire, tous les threads se référant à cette même zone mémoire, ils auront tous accès à la même valeur. Zut, ça fonctionne pas comme en java =/

    mais alors, comment pourrais-je remédier à ce problème? je peux quand même pas créer autant de pointeurs que de fois où je créerai un thread? c'est pas très propre

    [EDIT]
    enfait, il faudrait que je puiss envoyer le contenu du pointeur et non le pointeur lui même... mais avec ce cast en void, pas moyen.. j'obtiens des erreurs de segmentation

  4. #4
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par seb__
    mais alors, comment pourrais-je remédier à ce problème? je peux quand même pas créer autant de pointeurs que de fois où je créerai un thread? c'est pas très propre

    [EDIT]
    enfait, il faudrait que je puiss envoyer le contenu du pointeur et non le pointeur lui même... mais avec ce cast en void, pas moyen.. j'obtiens des erreurs de segmentation
    Passe au thread un pointeur sur une copie de la chaîne.
    Ou alors revois la conception de ton programme.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    je pense que l'intégralité de la lecture du fichier devrait être effectuée dans un thread pas une partie !
    Ce n'est pas intégre :si le thread se bloque ou quoique ce soit des handle de FILE vont être ouverts inutilement et incorrectement fermés

    Bonjour,
    dans un programme j'utilise des threads, aucunne erreur de compilation ou quoi que ce soit, mais j'ai le problème suivant:
    Il faudrait mettre cela en gros dans une FAQ : ce qui peut passer et valide en conception et en "grammaire" du langage peut bloquer en exécution !
    Tu peux très bien déclarer int *p; *p=10; et cela plante

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    c'est à dire que la lecture se fait dans le même thread, les threads se chargent juste du traitement de la ligne.

    Pour l'erreur de compilation, je voulais dire que mon erreur ne venait pas d'une compilation

    ok je vais tenter de changer l'architecture du programme.. cela dit si quelqu'un a une idée pour passer le contenu d'un pointeur au thread..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'exécution avec Dec C++
    Par PNL dans le forum C
    Réponses: 20
    Dernier message: 02/10/2005, 03h59
  2. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34
  3. Problème d'exécution : 'rtl60.bpl introuvable'
    Par zeddy23 dans le forum EDI
    Réponses: 3
    Dernier message: 27/07/2005, 20h44
  4. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo