Golong Nebenläufigkeit: Wie man an die gleiche Scheibe von verschiedenen goroutines anfügt

8

Ich habe gleichzeitige goroutines, die eine (Zeiger zu a) Struktur an die gleiche Scheibe anhängen möchten. Wie schreibt man das in Go, um es nebenläufigkeitssicher zu machen?

Dies wäre mein Nebenläufigkeits-unsicherer Code, der eine Wartegruppe verwendet:

%Vor%

Ich denke, Sie müssten Go-Kanäle für die Gleichzeitigkeits-Sicherheit verwenden. Kann jemand mit einem Beispiel beitragen?

    
Daniele B 28.08.2013, 22:30
quelle

3 Antworten

13

Es ist nichts falsch daran, das MySlice = append(MySlice, &OneOfMyStructs) mit einem sync.Mutex zu schützen. Aber natürlich können Sie einen Ergebniskanal mit der Puffergröße len(params) haben. Alle goroutines senden ihre Antworten und sobald Ihre Arbeit beendet ist, sammeln Sie von diesem Ergebniskanal.

Wenn Ihr params eine feste Größe hat:

%Vor%

Da alle Goroutinen in verschiedene Speicher schreiben, ist das nicht rassig.

    
Volker 28.08.2013 23:02
quelle
5

Die von @jimt gepostete Antwort ist nicht ganz richtig, da sie den letzten im Kanal gesendeten Wert nicht enthält und der letzte defer wg.Done() niemals aufgerufen wird. Das folgende Snippet enthält die Korrekturen.

Ссылка

%Vor%     
chris 21.08.2016 14:38
quelle
2

Ein Kanal ist der beste Weg, dies anzugehen. Hier ist ein Beispiel, das auf Spielplatz gehen laufen kann.

%Vor%

Hinweis : Der runtime.Gosched() -Aufruf ist da, weil diese goroutines dem Scheduler nicht ergeben. Das würde einen Deadlock verursachen, wenn wir nicht explizit etwas tun, um den Scheduler auszulösen. Eine andere Option könnte gewesen sein, einige I / O durchzuführen (z. B. print to stdout). Aber ich finde ein runtime.Gosched() einfacher und klarer in seiner Absicht.

    
jimt 28.08.2013 23:02
quelle

Tags und Links