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

Windows Discussion :

MultiThreading / Intérêt du SLEEP


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut MultiThreading / Intérêt du SLEEP
    Bonjour,

    J'aurais aimé savoir à quoi sert le SLEEP dans le cas d'un multithreading.
    Effectivement, ça sert à endormir le thread mais quelle est l'utilité?

    Par exemple :
    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
    51
    #include <windows.h>
    #include <stdio.h>
    
    int m_thread1_on_run;
    int m_thread2_on_run;
    
    static DWORD WINAPI FunctionForThread1( void *Param )
    {
    	while(m_thread1_on_run)
    	{
    		fprintf(stdout, "Thread 1\n");
    //		::Sleep(200);  // <--- UTILITE???
    	}
    
        return 0; 
    } 
    
    static DWORD WINAPI FunctionForThread2( void *Param )
    { 
    	while(m_thread2_on_run)
    	{
    		fprintf(stdout, "Thread 2\n");
    //		::Sleep(200);  // <--- UTILITE??? 
    	}
    
    	return 0; 
    } 
    
    
    
    int main(int argc, char*argv[])
    {
    	m_thread1_on_run = true;
    	m_thread2_on_run = true;
    
    
    	HANDLE m_h_thread1 = ::CreateThread( NULL, 0, FunctionForThread1, NULL, 0, NULL );
    	HANDLE m_h_thread2 = ::CreateThread( NULL, 0, FunctionForThread2, NULL, 0, NULL );
    
    	::Sleep(5000);
    
    	m_thread1_on_run = false;
    	m_thread2_on_run = false;
    
    
    	::WaitForSingleObject(m_h_thread1, INFINITE);
    	::WaitForSingleObject(m_h_thread2, INFINITE);
    	
    	return EXIT_SUCCESS;
    }
    Quel serait l'utilité de décommenter les SLEEP?


    Merci d'avance pour votre aide, car j'ai vraiment du mal à voir l'utilité de la commande SLEEP?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'intérêt c'est d'endormir le thread pendant 200 ms à chaque tour de boucle, sûrement pour ne pas afficher "Thread x" 500 fois par seconde.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Dans la realité, il n'existe qu'un thread par processeur.

    Mettre un sleep a donc une utilité :

    Si tu n'en met pas, tu monopolise des ressources pour un thread. cela peu par exemple etre prejudiciable a une autre thread, qui lui a vraiment besoin de ressources.

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par deadalnix
    Dans la realité, il n'existe qu'un thread par processeur.

    Mettre un sleep a donc une utilité :

    Si tu n'en met pas, tu monopolise des ressources pour un thread. cela peu par exemple etre prejudiciable a une autre thread, qui lui a vraiment besoin de ressources.
    Donne moi un exemple en particulier.
    Car dans mon exemple, j'ai bien des affichages du "thread 1" et "thread 2" (sans SLEEP), ainsi ça ne monopolise rien.
    j'ai du mal à saisir...

  5. #5
    Membre actif
    Étudiant
    Inscrit en
    Février 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 193
    Points : 246
    Points
    246
    Par défaut
    Simple :

    Thread1 effectue un travail lourd
    Thread2 vérifie de temps en temps l'avancement de Thread1.

    Si Thread1 et Thread2 ont la même priorité et aucun sleep, autant de temps processeur sera alloué à Thread1 et Thread2...

    Alors que la logique voudrait que Thread1 s'exécute la majorité du temps et que Thread2 ne se reveille que de temps en temps pour vérifier l'avancement ... d'où l'interêt du sleep().
    Java/J2EE, PHP, ASP.NET

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le sleep() réduit la consommation de ressources par le thread, puisqu'après chaque itération il fait forcément une pause de 200ms.
    Ceci permet aux autres threads, y compris ceux de priorité inférieure, d'utiliser le processeur pendant que le thread leur laisse la place.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Cyr1c
    Simple :

    Thread1 effectue un travail lourd
    Thread2 vérifie de temps en temps l'avancement de Thread1.

    Si Thread1 et Thread2 ont la même priorité et aucun sleep, autant de temps processeur sera alloué à Thread1 et Thread2...

    Alors que la logique voudrait que Thread1 s'exécute la majorité du temps et que Thread2 ne se reveille que de temps en temps pour vérifier l'avancement ... d'où l'interêt du sleep().
    Cela voudrait donc dire que si on met un sleep dans le Thread2 alors au final le programme sera plus rapide puisque Thread1 serait exécuté plus souvent?
    Ai-je bien compris?

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Médinoc
    Le sleep() réduit la consommation de ressources par le thread, puisqu'après chaque itération il fait forcément une pause de 200ms.
    Ceci permet aux autres threads, y compris ceux de priorité inférieure, d'utiliser le processeur pendant que le thread leur laisse la place.
    Cela veut donc dire que si on a :
    - 1 thread de forte priorité
    - 2 threads de faible priorié
    Alors si on met pas de sleep dans le thread de forte priorité, les threads de faible priorité ne seron jamais exécutés?
    Ai-je bien compris?

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    "jamais" en théorie, presque en pratique, pour plusieurs raisons:
    1. Le thread de haute priorité peut être mis en attente pour des entrées/sorties (accès aux fichiers, swap mémoire)
    2. Un mécanisme anti-famine est déclenché dans le noyau Windows à intervalles de trois secondes: Les threads "affamés" reçoivent deux slots de temps puis retombent.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Médinoc
    "jamais" en théorie, presque en pratique, pour plusieurs raisons:
    1. Le thread de haute priorité peut être mis en attente pour des entrées/sorties (accès aux fichiers, swap mémoire)
    2. Un mécanisme anti-famine est déclenché dans le noyau Windows à intervalles de trois secondes: Les threads "affamés" reçoivent deux slots de temps puis retombent.
    C'est un peu du chinois...
    Je ne comprends toujours pas l'utilité du sleep... Il me faudrait peut-être un exemple très concret.

    Merci d'avance...

  11. #11
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par chris_wafer
    C'est un peu du chinois...
    Je ne comprends toujours pas l'utilité du sleep... Il me faudrait peut-être un exemple très concret.

    Merci d'avance...
    Exemple :
    Serveur de partage de fichier.

    Plein de client demande des fichiers au serveur. Il y a création d'un thread juste avant le transfert du fichier.

    Comme le serveur est surchargé, il y a dans le protocole l'envoie au client d'un message du style :
    6789 TCP 2 qui va signifier : connecte toi sur le porte 6789 avec le protocole TCP, je met un timeout de 2 secondes (utile pour éviter de plomber le serveur). Si la personne ne s'est pas connectée dans 2 secondes, le serveur suppose le transfert échoué.

    Donc l'algorithme va simplement s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Création du socket de connecter
    
    Envoyer au client "6789 TCP 2"
    Dormir 2 secondes
    Regarder si quelqu'un s'est connecté sur le socket
     Si personne, on tue le thread
    Sinon
     On lance le transfert
    Le serveur peut ne pas vouloir que le thread se réveille avant les deux secondes car il peut être surchargé, il sait par exemple qu'un transfert va se finir d'ici 1 seconde ce qui va lui permettre de gérer plus facilement un nouveau transfert dans deux secondes.
    Je ne répondrai à aucune question technique en privé

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut
    Peut-être que quelqu'un aurait un exemple plus simple?

  13. #13
    Membre actif
    Étudiant
    Inscrit en
    Février 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 193
    Points : 246
    Points
    246
    Par défaut
    Citation Envoyé par chris_wafer
    Cela voudrait donc dire que si on met un sleep dans le Thread2 alors au final le programme sera plus rapide puisque Thread1 serait exécuté plus souvent?
    Ai-je bien compris?
    Oui, c'est ca

    Le sleep permet de s'assurer de laisser la main aux autres Threads.
    Java/J2EE, PHP, ASP.NET

  14. #14
    Membre à l'essai
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    Points : 21
    Points
    21
    Par défaut
    C'est vraiment pas encore très clair...

Discussions similaires

  1. [langage] fonction sleep + probleme fenetre dos
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2003, 19h46
  2. Quel est l'intérêt des Services Web ??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 19
    Dernier message: 12/02/2003, 22h28
  3. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16
  4. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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