2017-05-24 10 views
2

Je dois envoyer et recevoir à plusieurs reprises des datagrammes UDP depuis/vers un socket. Mon idée était d'engendrer deux fils, l'un responsable de l'envoi et l'autre de la réception. L'idée entière n'a de sens que s'il est possible à un thread d'attendre recv() en bloquant et l'autre en cours d'exécution send() sur le même socket en même temps.Est-ce que deux threads peuvent être simultanément `send` et` recv` sur le même socket?

j'ai fait quelques recherches sur Google et a trouvé cette question SO: Are parallel calls to send/recv on the same socket valid? La réponse acceptée mentionne que send() et recv() sont thread-safe (ouf ...), mais procède à une remarque alarmante:

Cela ne signifient nécessairement qu'ils seront exécutés en parallèle

Oups. Cela signifie-t-il que si j'implémente mon idée multithread, vais-je finir par attendre que le thread expéditeur attende le recv() du thread de réception avant de commencer à envoyer ses données? Mal.

Il est douteux que cette réponse acceptée fait référence à deux s send() parallèles de » seulement, ou si la préoccupation est réelle aussi pour tenter de signer un send() en parallèle et un recv(). Par conséquent:

Est-ce un appel à send() et un appel à recv() sur la même prise par deux fils être exécuté en parallèle, ou sera l'un de ces appels bloquer jusqu'à ce que les autres déclarations?

+0

Pourquoi ne pas configurer une file d'attente de travail pour les paquets reçus qui sont traités par l'autre thread? Le partage de descripteurs de fichiers entre les threads est probablement une mauvaise idée. – tadman

+2

1. Ils peuvent ... acheter, à mon humble avis: 2. Ce serait une mauvaise conception de le faire. 3. En supposant qu'un seul thread est en train de lire et que l'autre ne fait que l'envoyer, il peut s'agir d'un design légèrement meilleur, mais il est encore pauvre. 4. Le blocage sur 'send' ou' recv' n'est pas une utilisation efficace de la CPU ou de l'heure de votre programme. 4. Vous avez à peine besoin de threads pour cela, vous pouvez exécuter un serveur entier avec plus de 10K sockets sur un thread. – Myst

+0

@tadman Pourquoi est-ce une mauvaise idée? Le problème est que les paquets doivent être envoyés toutes les 20ms, donc je ne peux pas attendre de recevoir quelque chose avant d'envoyer quoi que ce soit. Je pensais que la désignation d'un thread pour effectuer l'envoi rendrait plus facile de garder cet intervalle de 20 ms non affecté par un surdébit de traitement non lié – gaazkam

Répondre

0

Réponse courte: Vous devriez pouvoir avoir des threads séparés pour l'envoi et la réception avec le même socket.

Un scénario courant est une application de vidéoconférence. Vous voudrez peut-être enregistrer un thread depuis le microphone et envoyer du son via le port udp. Un autre thread reçoit des paquets sur le même port et les rejoue sur les haut-parleurs. Si votre protocole est plus synchrone (c'est-à-dire un flux de requête/réponse - pour envoyer, vous devez d'abord recevoir quelque chose en premier), alors un seul thread probable a plus de sens du point de vue du design. Pourquoi ne pas configurer une file d'attente de travail pour les paquets reçus qui sont traités par l'autre thread?