- Pouvons-nous appeler send d'un thread et recv d'un autre sur le même socket?
- Pouvons-nous appeler plusieurs envois en parallèle à partir de différents threads sur le même socket?
Je sais qu'une bonne conception devrait éviter cela, mais je ne sais pas comment ces API système se comporteront. Je suis incapable de trouver une bonne documentation également pour le même.
Tout pointeur dans la direction sera utile.
c
networking
sockets
Geai
la source
la source
Réponses:
POSIX définit send / recv comme des opérations atomiques, donc en supposant que vous parlez d'envoi / recv POSIX alors oui, vous pouvez les appeler simultanément à partir de plusieurs threads et les choses fonctionneront.
Cela ne signifie pas nécessairement qu'ils seront exécutés en parallèle - dans le cas d'envois multiples, le second bloquera probablement jusqu'à ce que le premier se termine. Vous ne le remarquerez probablement pas beaucoup, car un envoi se termine une fois qu'il a mis ses données dans le tampon de socket.
Si vous utilisez des sockets SOCK_STREAM, essayer de faire des choses en parallèle est moins susceptible d'être utile car send / recv peut envoyer ou recevoir seulement une partie d'un message, ce qui signifie que les choses pourraient se diviser.
Le blocage d'envoi / réception sur les sockets SOCK_STREAM ne bloque que jusqu'à ce qu'ils envoient ou reçoivent au moins 1 octet, donc la différence entre bloquant et non bloquant n'est pas utile.
la source
send
retourne dès que les données sont placées dans le tampon d'envoi, et les données sont envoyées via la pile netowrk et sur le réseau de manière asynchrone. Donc, si vous avez un thread d'envoi et un thread de réception, il est tout à fait possible (même probable) pour le thread d'envoi d'envoyer plusieurs paquets avant que le thread de réception ne reçoive le premier paquet. C'est entièrement asynchrone et non simultané.Le descripteur de socket appartient au processus, pas à un thread particulier. Par conséquent, il est possible d'envoyer / recevoir vers / depuis le même socket dans différents threads, le système d'exploitation gérera la synchronisation.
Cependant, si l'ordre d'envoi / réception est sémantiquement significatif, vous-même (respectivement votre code) devez vous assurer d'un bon séquencement entre les opérations dans les différents threads - comme c'est toujours le cas avec les threads.
la source
Je ne vois pas comment recevoir en parallèle pourrait accomplir quoi que ce soit. Si vous avez un message de 3 octets, 1 thread pourrait obtenir les 2 premiers octets et un autre le dernier octet, mais vous n'auriez aucun moyen de dire lequel était lequel. À moins que vos messages ne durent qu'un octet, il n'y a aucun moyen de faire fonctionner quoi que ce soit de manière fiable avec la réception de plusieurs threads.
Plusieurs envois peuvent fonctionner, si vous avez envoyé l'intégralité du message en un seul appel, mais je ne suis pas sûr. Il est possible que l'un puisse en écraser un autre. Il n'y aurait certainement aucun avantage en termes de performances à le faire.
Si plusieurs threads doivent être envoyés, vous devez implémenter une file d'attente de messages synchronisés. Avoir un thread qui effectue l'envoi réel qui lit les messages de la file d'attente et que les autres threads mettent des messages entiers en file d'attente. La même chose fonctionnerait pour la réception, mais le thread de réception devrait connaître le format des messages afin de pouvoir les désérialiser correctement.
la source