- 我们能否在同一个套接字上从一个线程调用send,而从另一个线程调用recv?
- 我们能否在同一个套接字上并行地从不同的线程调用多个send?
我知道一个好的设计应该避免这种情况,但是我不清楚这些系统API会如何运作。我也找不到相关的文档。
如果有任何指导方向的建议将会很有帮助。
我知道一个好的设计应该避免这种情况,但是我不清楚这些系统API会如何运作。我也找不到相关的文档。
如果有任何指导方向的建议将会很有帮助。
POSIX将send/recv定义为原子操作,因此假设您谈论的是POSIX send/recv,那么是的,您可以从多个线程同时调用它们,而且一切都能正常工作。
这并不一定意味着它们将并行执行--在多个发送的情况下,第二个发送可能会阻塞,直到第一个完成。 您可能不会注意到这一点,因为一旦发送将其数据放入套接字缓冲区中,发送就会完成。
如果您正在使用SOCK_STREAM套接字,尝试以并行方式执行任务的效果可能不那么实用,因为send/recv可能仅发送或接收消息的一部分,这意味着事情可能会被拆分。
在SOCK_STREAM套接字上进行阻塞式的send/recv只会阻塞,直到它们发送或接收至少1个字节,因此阻塞和非阻塞之间的差异没有用处。
send
函数在数据被放入发送缓冲区后立即返回,并且数据异步地通过网络堆栈发送到网络上。因此,如果有一个线程发送数据并且另一个线程接收数据,很可能在接收线程收到第一个数据包之前,发送线程会发送多个数据包。这是完全异步的,而不是同时进行的。 - Chris Dodd套接字描述符属于进程而不是特定的线程。因此,在不同线程中发送/接收来自同一套接字是可行的,操作系统将处理同步。
然而,如果发送/接收的顺序在语义上具有重要意义,则您自己(或您的代码)必须确保不同线程之间操作的正确排序 - 正如始终与线程一样。