Salut à vous,
Je suis en train de coder un petit serveur en utilisant les pthreads. Le problème, c'est que le thread faisant tourner la fonction serveur utilise 99% du CPU, à cause des i/o non bloquantes. Le code ressemble à ça :
void *server(void)
{
....while ( contrôle du serveur)
....{
......../* Prépare le select à grand coup de FD_SET */
......../* Prépare la structure timeval, avec un timeout de 5000 uS */
........select
......../* Teste le set de socket et lance des threads interpreteurs */
......../* Teste une variable globale contrôlant l'état du serveur */
....}
....pthread_exit(code d'erreur);
}
Comment faire pour réduire la charge CPU à quelque chose de plus raisonnable ? J'ai joué un peu avec le timeout de select, mais ça n'a pas amélioré les choses. D'autre part, on m'a dit qu'utiliser les variables globales en C, c'était Mal, mais je ne vois pas comment m'en passer avec les threads. Y a-t-il un procédé plus élégant ?
Merci pour votre aide :)
# select() + timeout
Posté par WildChild . Évalué à 3.
# Non ce n'est pas mal
Posté par Pascal . Évalué à 3.
Non ce n'est pas mal tant que c'est utilisé judicieusement.
Mais si c'est mal utilisé c'est catastrophique pour la lisiiblité et la maintenance. C'est pour cela que l'on conseille souvent eux débutants de ne pas les utiliser.
# timeout
Posté par gc (site web personnel) . Évalué à 4.
[^] # Re: timeout
Posté par Nicolas Boulay (site web personnel) . Évalué à 3.
Donc boucler à moins que le HZ, fait que la tache est tout le temps prète.
sinon, je pense que le timout du select peut être très élevé sans que cela gène quoi que se soit.
"La première sécurité est la liberté"
[^] # Re: timeout
Posté par gc (site web personnel) . Évalué à 5.
tes deux dernières phrasent se contredisent, tu ne crois pas ?
# Ma méthode à moi...
Posté par Jean-Baptiste Mayer . Évalué à 4.
Lorsque le thread de contrôle veut dire quelque chose au thread serveur, il le réveille en écrivant dans le pipe, le reste de la comm se fait par segments de mémoire partagés.
[^] # Re: Ma méthode à moi...
Posté par JaguarWan . Évalué à 2.
Pour le contrôle, en fait ma fonction serveur lance un mini shell dans un autre thread au début, avant de boucler, en lui passant un pointeur vers une structure contenant quelques booleens et un pointeur sur requête. Comment ça se présente au niveau code la technique du pipe ? C'est portable ?
[^] # Re: Ma méthode à moi...
Posté par JaguarWan . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.