Arreter un select bloquand depuis un autre thread

Signaler
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
salut,
sous windows, j'ai pas de probleme, mais sous linux, quel est le moyen pour qu'un thread qui bloque sur un select bloquant se débloque? shutdown(sock, 2) et close(sock) semblent sans effet...

en fait j'en suis la:

// bind et listen sur le socket viennent d'etre fait.
fd_set set;
FD_ZERO(&set);
FD_SET(sock,&set);
if (select((int) sock + 1,&set,0,0,0) == 1) // ca bloque ici jusqu'a ce qu'un client arrive.
{
// etc.
}

depuis un autre thread, j'essaie de fermer sock, mais ca semble pas débloquer le select...
qqun sait comment faire ?
merci ;)

2 réponses

Messages postés
6
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
11 novembre 2005

salutation.

j'ai exactement le meme probleme ...

si tu as trouvé une solution ... n'hesite pas a m'en faire part :)
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,

oui j'ai trouvé,

la réponse c'est que c'est pas possible.

la
'solution' c'est de faire un select avec un timeout de 100ms par
exemple (ou moins, mais bon un timeout < 10ms est pas pertinent
(c-a-d que ton os va pas forcément attendre exactement 10ms, parce que
la 'résolution' de l'attente est pas assez bonne)), et
tu atteins ton timeout total en faisant une boucle.



A chaque
iteration tu regardes si un autre thread (avec une variable partagée,
ou globale) te demande d'arreter, et si oui tu te casses de la boucle,
et tu sors du thread.



voila... la sortie du thread qui fait le
select sera pas instantannée; mais prendra 100ms (ou moins) donc c'est
completement acceptable.



si t'as une autre idée, ou qu'un jour
tu trouves comment faire mieux, dis moi ... si t'as pas pigé tout ce
que j'ai raconté, demande moi aussi



allez a+