D�bloquer une lecture sur cin en multithread
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 :
Code:
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;
} |
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.
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!