在同一个套接字上并行调用send / recv是否有效?

  1. 我们可以调用从一个线程发送和从另一个在同一个套接字recv?
  2. 我们可以在同一个套接字上调用多个来自不同线程的并行发送吗?

我知道一个好的devise应该避免这一点,但我不清楚这些系统API将如何performance。 我也找不到一个好的文档。

任何方向的指针都会有所帮助。

POSIX将send / recv定义为primefaces操作,所以假设你正在讨论POSIX send / recv,那么你可以同时从多个线程中调用它们,事情就会起作用。

这并不一定意味着他们会并行执行 – 在多次发送的情况下,第二次可能会阻塞,直到第一次完成。 您可能不会注意到这一点,因为发送完成后,将其数据放入套接字缓冲区。

如果你正在使用SOCK_STREAM套接字,试图做一个并行的东西不太可能是有用的,因为send / recv可能只发送或接收消息的一部分,这意味着事情可能会分裂。

阻塞SOCK_STREAM套接字上的发送/接收只会阻塞,直到它们发送或接收至less1个字节,所以阻塞和非阻塞之间的区别是没有用的。

套接字描述符属于进程,而不属于特定的线程。 因此,可以在不同的线程中发送/接收同一套接字,操作系统将处理同步。

但是,如果发送/接收的顺序在语义上是重要的,那么你自己(分别是你的代码)必须确保在不同线程中的操作之间有适当的顺序 – 线程总是如此。

我不知道如何并行地完成任何事情。 如果你有一个3字节的消息,1个线程可以得到前2个字节,另一个字节可以得到最后一个字节,但是你不知道哪个是哪个字节。 除非你的消息只有一个字节长,否则你无法可靠地使multithreading接收工作。

如果您在一次通话中发送完整消息,则可能会发送多个发送消息,但我不确定。 有可能会覆盖另一个。 这样做肯定没有任何性能上的好处。

如果需要发送多个线程,则应该实现一个同步的消息队列。 有一个线程可以执行从队列中读取消息的实际发送,并让其他线程排入整个消息。 同样的事情将接收,但接收线程将不得不知道消息的格式,以便它可以正确反序列化它们。