Answers:
POSIX将send / recv定义为原子操作,因此假设您在谈论POSIX send / recv,那么可以,您可以从多个线程同时调用它们,然后一切正常。
这不一定意味着它们将并行执行-在多次发送的情况下,第二个可能会阻塞直到第一个完成。您可能不会注意到太多,因为发送一旦将其数据放入套接字缓冲区就完成了。
如果您使用的是SOCK_STREAM套接字,则尝试并行执行操作的可能性较小,因为send / recv可能仅发送或接收部分消息,这意味着事情可能会分开。
在SOCK_STREAM套接字上阻塞发送/接收仅阻塞,直到它们发送或接收至少1个字节为止,因此阻塞与非阻塞之间的区别没有用。
send
一旦将数据放入发送缓冲区,A就会返回,并且数据通过netowrk堆栈继续发送,并异步发送到网络上。因此,如果您有一个发送线程和一个接收线程,则发送线程在接收线程接收第一个数据包之前完全有可能(甚至可能)发送许多数据包。它完全异步,而不是同时发生。
套接字描述符属于进程,而不属于特定线程。因此,可以在不同线程中向同一套接字发送/从同一套接字接收消息,操作系统将处理同步。
但是,如果发送/接收的顺序在语义上很重要,那么您自己(分别是您的代码)就必须确保不同线程中的操作之间正确排序(与线程一样)。
我看不到并行接收如何完成任何工作。如果有3个字节的消息,则1个线程可以得到第一个2个字节,而另一个则得到最后一个字节,但是您无法知道哪个是哪个。除非您的消息只有一个字节长,否则无法可靠地使多个线程接收任何内容。
如果您在一次通话中发送了整个邮件,则多次发送可能会起作用,但是我不确定。一个人可能会覆盖另一个人。这样做绝对不会对性能产生任何好处。
如果需要发送多个线程,则应实现一个同步的消息队列。具有一个实际执行发送操作的线程,该线程从队列中读取消息,而让其他线程使整个消息入队。相同的东西对于接收也适用,但是接收线程将必须知道消息的格式,以便可以正确地反序列化它们。