Forum Programmation.c Fourberies de libpthread...

Posté par  .
Étiquettes : aucune
0
19
mar.
2005
Bonsoir à tous,

J'ai quelques soucis de portabilité avec la libpthread, et j'aurais besoin de votre expérience pour déterminer ce qui ne va pas dans mon utilisation de cette bibliothèque.

Mon petit serveur écoute grace à un thread dédié, qui boucle sur accept et enregistre les sockets récupérés dans un tableau.

Quand je quitte mon application, accept() étant bloquant, je suis dans l'obligation de faire un pthread_cancel() sur ce thread (et pour etre propre, un pthread_join() juste derrière). Normalement, accept() est un point de cancelation valide puisqu'il bloque. Mais si sous Linux tout se passe comme prévu, les implémentation Mac OS X et Windows ne tuent pas le thread...

Comme un autre thread similaire utilisant fgets() refusait de mourir sous Windows, j'en ai déduit que la cancelation des fonctions bloquantes ne devait pas etre tout à fait portable.

Qu'à cela ne tienne, j'ai passé mon socket d'écoute en non bloquant sur ces deux systèmes et ajouté des pthread_testcancel(). Là, sous Mac OS X et Windows le thread est bien tué, mais sous Windows le pthread_join() freeze l'application !

Vu les différences de comportement, je pense que je fais quelque chose de Mal®, ou que quelque chose m'a échappé...

Je vous serais vraiment très reconnaissant si vous pouviez me dire ce qui ne va pas dans mon code :)
  • # y a un autre moyen

    Posté par  . Évalué à 4.

    ça fonctionne pas pareil sur toutes les platteforme, surtout que les pthread ne sont pas vraiment nativement supportés sous windows et passent par les WinThread ...
    De toute façon arrêter un thread alors qu'il tourne c'est pas très conseillé, car tu le force à quitter alors qu'il est en cours de traitement... mieux vaut lui demander poliement de s'arrêter et lui laisser le soin de sortir tout seul comme un grand...
    pour ça je te conseille de faire une boucle qui teste à la foi ce qui arrive sur ton port serveur (avec un select(), ou un epoll() ) pour savoir si une connection arrive et une variable condition qui basculera quand on demande au thread de quitter... pour moi cette technique fonctionne très bien.

    en speudo code:

    int threadfunc(void* param){
    while ( testExit()==false){
    if(select(...)>0)
    tableau[i] = accept(...);
    }
    }
    • [^] # Re: y a un autre moyen

      Posté par  . Évalué à 2.

      Merci beaucoup, j'ai modifié mon code de la sorte et ça marche uniformément bien maintenant :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.