1.我们可以在同一个net.UDPConn或net.TCPConn对象上调用从一个线程发送和从另一个线程接收吗?

2.我们可以从同一net.UDPConn或net.TCPConn对象上的不同线程并行调用多个发送吗?

同样,我也找不到很好的文档。
Golang套接字API线程安全吗?

我发现很难测试它是否是线程安全的。
方向上的任何指针都会有所帮助。

我的测试代码如下:

这个测试代码可以吗?


net.Conn的文档说:

Multiple goroutines may invoke methods on a Conn simultaneously.


Multiple goroutines may invoke methods on a Conn simultaneously.

我对上述doc的解释是,如果您从多个go例程中调用net.Conn上的ReadWrite,则不会发生灾难性的事情,而从多个go例程中调用net.Conn上的Write进行序列化,这样从2个单独调用Write的字节在写入网络时将不会被交错。

您提供的代码的问题在于,不能保证Write一次性写入提供给它的整个字节片。您将忽略已写入多少字节的指示。

因此,要确保编写所有内容,您需要循环并调用Write,直到所有senddata发送完毕。但是net.Conn仅确保一次写入调用的数据不会交错。鉴于您可能发送带有多个写入调用的单个数据块,因此不能保证单个数据块将完整到达其目的地。

例如3"您好客户!"消息可能以以下形式到达。

" hellohellohello客户!客户!客户!"

因此,如果您希望通过多个go例程在net.Conn上可靠地写入消息,则需要同步这些例程以确保完整写入单个消息。

如果要执行此操作,第一次尝试时,我将具有一个go例程,该例程从一个或多个消息通道读取并写入net.Conn,然后多个go例程可以写入这些消息通道。