我有多个Goroutine共享一个net.Conn对象。他们可以同时发出写 call 吗?

我主要关心的是部分完成的Write调用。假设我打算写100个字节,但是只发送了30个字节,因此我需要再发送70个字节。为此,我通常会编写一个循环:

count := 0
for count < len(buf) {
    byteSent, err := conn.Write(buf[count:])
    //check error

    count += byteSent
}

但是我看到Go在net.Conn.Write行号318中实现了这个循环,并且它是通过锁定来实现的。

但是,在Windows实现上,除了存在对WSASend的调用之外,没有这样的循环。我不知道WSASend的行为如何,并且无法从MSDN文档中获得太多帮助

因此,问题是:

[编辑]添加了第四个问题
  • 每次写入套接字时都需要获取锁吗?
  • 如果是,则无法达到在Write实现中获取锁的目的。
  • 在unix实现中,这是否意味着除非err!= nil,否则我无法获得byteSent
  • Windows上的WSASend是否在Unix实现中实现了等效循环
  • 最佳答案

    是的,您可以并行调用net.Conn的write方法。
    net.Conn契约(Contract)的一部分是,可以同时从多个Goroutine中使用它。这是在its documentation中明确调用的:



    尽管我不能特别谈谈Windows实现,但此声明适用于所有平台。由于Windows实现中没有循环,因此WSASend调用必须保证Unix API不会。

    07-24 09:37
    查看更多