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 scheduler - sched_yield ne rend pas la main


Sujet :

POSIX C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    15
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 15
    Par d�faut Pthread et scheduler - sched_yield ne rend pas la main
    Bonjour !

    J'essaye de provoquer un affichage de "hello" (premier thread) et "world" (second thread) en alternance. Je suis sous Ubuntu, voici le code :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <sched.h>
     
    // Fonction appelée lors de la création de thread
    void *print (void * arg)
    {
      int i;
      for (i = 0 ; i < 5 ; i++) {
        printf ("Thread %s\n", (char*)arg);
        sched_yield(); // rend la main
      }
      pthread_exit (0);
    }
     
    // MAIN
    main (int ac, char **av)
    {
      pthread_t th1, th2;
      void *ret;
     
      // création premier thread
      if (pthread_create (&th1, NULL, print, " 1 Hello") < 0) {
        fprintf (stderr, "pthread_create error for thread 1\n");
        exit (1);
      }
     
      // création second thread
      if (pthread_create (&th2, NULL, print, " 2 World!") < 0) {
        fprintf (stderr, "pthread_create error for thread 2\n");
        exit (1);
      }
     
      (void)pthread_join (th1, &ret);
      (void)pthread_join (th2, &ret);
    }
    Mais le r�sultat obtenu est
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Thread  1 Hello
    Thread  1 Hello
    Thread  1 Hello
    Thread  1 Hello
    Thread  1 Hello
    Thread  2 World!
    Thread  2 World!
    Thread  2 World!
    Thread  2 World!
    Thread  2 World!
    Est-on oblig� de passer par des mutex et conditions ?
    Ou peut-�tre ai-je mal compris la doc de sched_yield() ?

    Merci pour votre aide.

    J'obtien le r�sultat voulu en rempla�ant la boucle :
    for (i = 0 ; i < 5 ; i++) par une boucle infinie for( ; ; )

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Ben d�j�, tu ne testes pas le r�sultat du yield, donc...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    2 015
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 2 015
    Par d�faut
    Il n'a pas d'erreur possible sous linux pour cette fonction.
    In the Linux implementation, sched_yield() always succeeds.

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    2 015
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 2 015
    Par d�faut
    Il n'y a pas sp�cialement de probl�me avec ce code, l'ordonnancement n'est pas quelque chose de pr�visible � 100%, dans ton cas, pour peu que tu es 2 coeurs sur ton processeur et que chacun des 2 threads tournent sur un coeur diff�rent, le sched_yield() sera sans effet dans ce cas.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 9
    Dernier message: 16/11/2007, 11h33
  2. R�ponses: 1
    Dernier message: 15/05/2007, 09h16
  3. le Timer ne me rend pas la main
    Par toxycyty dans le forum Windows
    R�ponses: 10
    Dernier message: 08/11/2006, 16h54
  4. RMAN ne rend pas la main
    Par big1 dans le forum Recovery Manager
    R�ponses: 3
    Dernier message: 29/08/2006, 20h18
  5. Script CMD qui ne rend pas la main
    Par ipeteivince dans le forum Autres Logiciels
    R�ponses: 2
    Dernier message: 10/06/2005, 11h00

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