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

SL & STL C++ Discussion :

Incompréhension sur std::thread (non asynchrone?)


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut Incompréhension sur std::thread (non asynchrone?)
    Hello,


    Je suis actuellement en train d'essayer les std::thread C++, et je bloque sur quelque chose que je ne saisie pas conceptuellement.


    Code compilable:
    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
    #include <iostream>
    #include <thread>
    #include <unistd.h>
    #include <string.h>
     
    void	thread_a(void)
    {
    	char		buffer[1024];
     
    	std::cout << "ok" << std::endl;
    	memset(buffer, 0, 1024);
    	read(1, buffer, 1023);
    	std::cout << "stdout 1: " << buffer << std::endl;
    	memset(buffer, 0, 1024);
    	read(1, buffer, 1023);
    	std::cout << "stdout 2: " << buffer << std::endl;
    }
     
    int	main(void)
    {
    	std::thread	ta(thread_a);
    	char			buffer[1024];
     
    	ta.join();
    	while (1)
    	{
    		memset(buffer, 0, 1024);
    		read(0, buffer, 1023);
    		std::cout << "stdin: " << buffer << std::endl;
    	}
    	std::cout << "huh" << std::endl;
     
    	return (0);
    }
    Code + Output: http://puu.sh/hF1iF/9c27c51de6.png


    Alors voilà, selon moi, dans l'exemple précédent, la fonction thread_a aurait dû se lancer, et en même temps, la while (1) du dessous commencer à tourner ; mais non! Ce dernière a été atteinte seulement lorsque la fonction thread_a s'est terminée.
    De plus, dans mon second exemple (en bas à droite sur la screenshot), j'ai lancé deux threads à la suite, un faisant des ABCDEF... et l'autre des 0123456... -- les deux se sont bien lancés en même temps, mais, là encore, il m'a fallut attendre la fin des deux threads afin de voire la suite de mon main.

    Mon exemple mi-C, mi-C++ est peut-être un peu dégueulasse, et assez loin de mon intention de base, mais je ne comprends toujours pas cette réaction.
    Je souhaite, à vrai dire, créer un serveur multi-client (déjà fait), mais qu'à chaque fois qu'un client se log (main loop), lancer un nouveau thread sur une fonction qui fait les présentation du genre "salut, t'es qui", login / password, toussa ; pendant que la boucle principale continue de checker les nouveaux clients, et ceux partant.
    Mais en comparant mon exemple et mon but, j'ai comme l'impression que le programme risque de rester bloquer dans la fonction "de présentation" pendant qqs secondes...

    Du coup, pourriez-vous m'aiguiller sur ce que je n'ai pas compris s'il vous plait?


    Bonne journée,
    Raphaël.


    PS: Je bosse sous un Lubuntu 15.04, avec g++ en version 4.9.2

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par doc
    join: waits for a thread to finish its execution
    Tu n'as pas compris quoi dans la fonction join ? Elle attends que le thead soit terminé

  3. #3
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Oh... je me sens stupide maintenant...
    J'aurais du garder la bonne habitude de lire les man avant de me lancer à l'aveuglette.
    (je suis du coup d'autant plus surpris de mon second exemple ; il arrive tout de même à lancer les 2 join() à la suite!)

    Du coup, vers quelle fonctione suis-je sensé m'orienter s'il te plait, detach()?

    Merci.


    EDIT: Ah ouais, ça me semble déjà mieux avec detach() :s, merci encore , et désolé..

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Quelle fonction pour faire quoi ?

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    detach n’est normalement nécessaire que si ton nouveau thread doit survivre à son parent. Si tu les lances depuis le thread principal, il n’y en a pas besoin.

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

Discussions similaires

  1. Deux threads sur une ressource non protégée
    Par ikuzar dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 01/03/2013, 15h44
  2. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02
  3. Afficher une texture "pleine" sur un support non c
    Par Mastero dans le forum DirectX
    Réponses: 20
    Dernier message: 27/01/2005, 13h28
  4. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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