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
    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 averti
    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é
    Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.

  3. #3
    Membre régulier
    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 averti
    Quelle fonction pour faire quoi ?
    Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.

  5. #5
    Membre émérite
    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.

###raw>template_hook.ano_emploi###