2016-06-20 1 views
-2

私のプログラム:プログラムが同時に100000のゴルーチンを実行し、すべてのゴルーチンが同じ接続にメッセージを送信します複数のゴルーチンが同時にConnのメソッドを呼び出すか?このような

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 
} 

は、私は疑問そのサーバーが「hellohelloworldworld」のようなエラーメッセージが表示されますよ、プログラムが私のUbuntu 14.04LTSで動いているときに問題はありません。

ので、同時にコネティカットのメソッドを呼び出す複数のゴルーチンていますか?

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

どのように私は原子Write方法を保つことができますか?

答えて

4

ドキュメントの状態:

複数ゴルーチンを同時にコネチカット上のメソッドを呼び出すことができます。

個々の書き込みがアトミックであるかどうかの言及はありません。現在の実装では、Writeへの各呼び出しが次の呼び出しを開始する前に完全に行われることが保証されていますが、言語仕様には保証はありません。

関連する問題