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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 éprouvé
    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
    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 actif
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    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 expérimenté
    Étudiant
    Inscrit en
    Février 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 193
    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().

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    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 actif
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    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?

  8. #8
    Membre actif
    Inscrit en
    Août 2007
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 94
    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?

  9. #9
    Membre expérimenté
    Étudiant
    Inscrit en
    Février 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 193
    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.

Discussions similaires

  1. [langage] fonction sleep + probleme fenetre dos
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2003, 20h46
  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, 23h28
  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, 13h16
  4. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 16h11
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 19/10/2002, 00h36

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