多个 goroutine 会同时调用 Conn 上的一个方法吗?

ada*_*jun -2 networking multithreading go goroutine

我的程序是这样的:

func handle(conn net.Conn) {
    msg := "hello, world!"
    for i:= 0; i< 100000; i++ {
        go func() {
            err := write(conn, msg)
        }
    }

}
func write(conn net.Conn, msg string) error {
    mlen := fmt.Sprintf("%04d", len(msg))

    _, err := conn.Write([]byte(mlen + msg))
    return err
}
Run Code Online (Sandbox Code Playgroud)

程序会同时运行100000个goroutine,所有的goroutine都会向同一个连接发送消息?我怀疑服务器会收到“hellohelloworldworld”之类的错误消息,但是在我的 Ubuntu 14.04LTS 中运行程序时没有问题。

那么,多个 goroutine 会同时调用 Conn 上的一个方法吗?

================================================== ========================

我怎样才能保持Write方法的原子性?

Jim*_*imB 5

该文件指出:

多个 goroutine 可以同时调用 Conn 上的方法。

没有提到每个单独的写入是否是原子的。虽然当前的实现可以确保每次调用都Write在下一次调用开始之前完全发生,但语言规范中没有保证。