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

POSIX C Discussion :

pthread et read


Sujet :

POSIX C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut pthread et read
    Bonjour, j'ai un problème avec un read() qui me retourne -1 avec errno = EINVAL. Le "man" dit "The STREAM or multiplexer referenced by fildes is linked (directly or indirectly) downstream from a multiplexer".

    Je suis sous UNIX (HP-UX en fait)
    J'ai plusieurs fichiers à copier par rcp puis à lire, et je lis systématiquement l'un pendant que je fais la copie du suivant. Pour ça, je crée à chaque itération 2 threads, l'un fait la lecture du fichier pendant que l'autre fait la copie du fichier suivant. L'intérêt est que la lecture du fichier me fait faire quelques calculs qui me prennent de la cpu, et que pendant ce temps là, je peux continuer d'utiliser le réseau et copier le fichier d'après.

    Dans le principe, mon code ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    static void *remote_copy_file(void *p_data)
    {
      char *file_to_copy = p_data;
      char command[256];
      sprintf(command, "rcp monAutreHost:%s %s", file_to_copy, file_to_copy);
      system(command);
      pthread_exit(0);
    }
     
    static void *process_file(void *p_data)
    {
      char *file_to_process = p_data;
      int fd = -1;
     
      fd = open(file_to_process...);
      read(fd...);   /* Je détaille pas, ce serait un peu long sinon */
      fait_des_calcul(...);
      read(fd...);
      fait_des_calcul(...);
      ...
      close(fd...);
      pthread_exit(0);
    }
     
    static void copy_while_process(char *file_to_copy, char *file_to_process)
    {
      pthread_t ta;
      pthread_t tb;
     
      if (file_to_copy != NULL)
        {
          pthread_create(&ta, NULL, remote_copy_file, file_to_copy);
        }
     
      if (file_to_process != NULL)
        {
          pthread_create(&tb, NULL, process_file, file_to_process);
        }
     
      if (file_to_copy != NULL)
        {
          pthread_join(ta, NULL);
        }
     
      if (file_to_process != NULL)
        {
          pthread_join(tb, NULL);
        }
    }
    Et j'utilise ça comme ça:
    copy_while_process("/tmp/file1", NULL);
    copy_while_process("/tmp/file2", "/tmp/file1");
    copy_while_process("/tmp/file3", "/tmp/file2");
    copy_while_process("/tmp/file4", "/tmp/file3");
    copy_while_process(NULL, "/tmp/file4");

    La plupart du temps, ça se passe bien, mais de temps en temps, je me prends un read qui retourne -1 avant la fin du fichier, avec l'erreur mentionnée au dessus. Ca arrive en plein milieu d'un fichier (je fais plusieurs read consecutifs sur le fichier. Les premiers passent bien, et j'ai ça au milieu).

    Je me dis que je dois faire une mauvaise utilisation des threads, mais laquelle?

    Merci à ceux qui m'ont lu jusqu'à la fin !

  2. #2
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    donc, d'aprés ce que j'ai compris:
    une operation de lecture
    puis
    une operation de copie ????

    Est ce que t'as verifié que le fichier n'est pas utiliser par les deux thread en même temps, sa arrive ??? de copie et de l'ecture ???

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut
    Si j'ai par exemple 4 fichiers à rapatrier en local, puis à lire sur le disque dur local, je fais ça:

    "rcp machineDistante:/tmp/file1 /tmp/file1"
    Puis
    "rcp machineDistante:/tmp/file2 /tmp/file2" et lecture /tmp/file1 en même temps.
    Puis
    "rcp machineDistante:/tmp/file3 /tmp/file3" et lecture /tmp/file2 en même temps.
    Puis
    "rcp machineDistante:/tmp/file4 /tmp/file4" et lecture /tmp/file3 en même temps.
    Puis
    Lecture /tmp/file4.

    Donc normalement, je me retrouve jamais à lire un fichier avant d'avoir fini de l'ecrire en local, puisque les pthread_join m'assurent qu'on va attendre la fin d'une des étape avant de passer à a suivante. (une étape étant le rcp d'un fichier pendant le lecture d'un autre).

    J'ai essayé de le vérifier un peu en ajoutant des traces au moment du changement d'étape (donc après les 2 pthread_join): j'ai vérifié que le fichier que je viens de copier sur disque local est bien complet (avec un petit system("ll <fichier"); ), j'ai même mis un sleep(10) au cas ou le "close" délèguerait une partie du boulot à l'OS, et rendrait la main avant que le fichier ne soit bien fermé, mais rien y fait, j'ai toujours le problème...

    (Oups, pardon cmoibal, j'ai édité mon post pour ajouter des infos pendant que tu répondais)

  4. #4
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    le problème (EINVAL) c'est que le pointeur sur le fichier a ete changer par un autre thread.... c'est pour ça que j'ai posé cette question !!!

    les fichiers que tu veuts les copiers sont de quel types ?

    personellment je voix, que tu doit ajouter les mutex sur l'ouverture des fichier pur qu'on soit sur qu'il est le seule a chercher ce fichier...

    Est ce que tu peut envoyer le code avec plus de details, merci ?

Discussions similaires

  1. read committed, serializable... et par défaut k'en est-il?
    Par superdada dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/12/2003, 18h58
  2. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  3. [LG]problème de read / readln
    Par jeremie60 dans le forum Langage
    Réponses: 7
    Dernier message: 08/06/2003, 23h33
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 15h00

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