2016-06-20 5 views
-2

Mein Programm wie folgt aus:.Wird eine Mehrfach-Goroutine gleichzeitig eine Methode auf einem Conn aufrufen?

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 
} 

Das Programm wird 100000 goroutines zur gleichen Zeit laufen, und alle goroutines werden Nachricht an die gleiche Verbindung senden Ich bin Zweifel, dass Server-Fehlermeldung wie „hellohelloworldworld“ erhalten wird, aber es gibt kein Problem, wenn das Programm in meinem Ubuntu 14.04LTS läuft.

Also, wird mehrere Goroutine eine Methode auf einem Conn gleichzeitig aufrufen?

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

Wie kann ich die Write Methode atomar halten?

Antwort

4

In der Dokumentation:

Mehrere goroutines gleichzeitig Methoden auf einem Conn aufrufen kann.

Es wird nicht erwähnt, ob jeder einzelne Schreibvorgang atomar ist. Während die aktuelle Implementierung sicherstellen kann, dass jeder Aufruf an Write vollständig stattfindet, bevor der nächste Aufruf beginnen kann, gibt es keine Garantie in der Sprachspezifikation.