2017-06-21 13 views
1

Je sais que les programmeurs ne sont souvent pas si faciles avec les threads et la programmation parallèle, donc c'est une question pour les experts en la matière en priorité.Pourquoi dup (2) écouter des sockets dans plusieurs serveurs à thread?

Il semble y avoir une bonne pratique relativement acceptée mais inconnue d'appeler dup (2) sur les sockets d'écoute pour les applications de serveur à thread. Je comprends le principe général de «ne rien partager» pour la tranquillité d'esprit en évitant les conditions de course.

Ma question est la suivante: si le noyau fait déjà une exclusion mutuelle sur accept (2) renvoie des valeurs, exactement pourquoi est-ce intéressant de duper (2) le socket d'écoute?

Dans le cas où c'est vraiment une amélioration, quand la socket doit-elle être dup (2): après bind (2) ou après listen (2)?

+0

Impossible de trouver une mention de cette pratique dans une recherche rapide. Ça me semble plutôt inutile. 'dup' crée uniquement un nouveau handle entier et duplique quelques indicateurs de bit relativement insignifiants (ou un seul), la * description de fichier ouverte * qui est la plus grande partie des données de fichiers/socket reste partagée. –

+0

Je suppose qu'il pourrait être lié à fermer (2) condition de course? – thodg

+0

Normalement, un serveur ne ferme pas une prise d'écoute, mais si cela est nécessaire pour une raison quelconque, alors peut-être que cela pourrait être raisonnable. –

Répondre

1

Oui Le noyau assure qu'un seul processus/thread sera servi dans les appels simultanés à accept. Si vous voulez l'utiliser correctement, alors vous devez le faire après bind et listen. Après bind parce que vous voulez partager une socket serveur lié ... Après listen pour configurer correctement le backlog pour tout le monde. Maintenant, c'est une question de conception: vous pouvez préférer avoir un seul thread acceptant répartir le travail parmi un groupe d'autres threads (vous devez ensuite gérer un pool par vous-même), ou avoir des threads acceptant simultanément et mettre le fardeau sur le système. Le premier est plus complexe à mettre en place mais vous permet d'avoir un meilleur contrôle sur l'équilibrage. La seconde est beaucoup plus simple mais ne vous donne aucun contrôle sur l'équilibrage.

+0

Insightful, mais encore pourquoi dup (2)? – thodg

+1

Peut-être parce qu'en cas de terminaison de fil, qui peut décider de fermer? Si chaque thread a son propre descripteur, le code est beaucoup plus simple? Utiliser 'dup' n'est certainement pas obligatoire. –