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 + Output: http://puu.sh/hF1iF/9c27c51de6.png
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); }
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
Partager