Bonjour
Je travaille actuellement sur une grosse appli serveur compilée en gcc/mingw avec les libs boost.
Cette appli peut se terminer sur une saisie utilisateur (mode console, pas de gui) , ou pour d'autres raison (erreur, reception d'un commande, etc).
En essayant d'implémenter cela, je m'aperçois que si un thread fait un appel a "exit()" pendant qu'un autre bloque en lecture sur cin, le programme ne se termine pas.
Voici un exemple de code simple qui provoque cette erreur :
aussi étonnant que ca puisse paraitre, ca affiche bien "thread calls exit" au bout d'une seconde, mais il faut valider une entrée clavier pour avoir la terminaison effective du programme, et ca, ca me gène beaucoup.
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 class Input : public Thread { public: Input() : Thread() { } virtual void threadMain() { sleep(1000); std::cout << "thread calls exit" << std::endl; exit(0); std::cout << "exit done"; } }; int main ( int argc, char* argv[] ) { Input input; input.run(); std::string i; std::cin >> i; std::cout << "ok, main unlocked with '"<<i << "'" << std::endl; return 0; }
J'ai essayé de débloquer cin avec des trucs de type putback, sync, en allant chercher le rdbuf, mais rien n'y fait, toutes ces méthodes sont bloquantes si un thread est en attente de lecture.
Et il ne parait pas du tout pertinent de passer en lecture non bloquante, ca serait une hérésie, donc pas de kbhit ou autre test...
Une demi réponse me suffirait : faire marcher le "exit" ou débloquer le cin
Merci pour vos idées!
Partager