Ist es sicher, auf verschiedene Strukturelemente aus verschiedenen Gruoutinen zuzugreifen?Ist es Thread sicher, auf verschiedene Mitglieder von struct in go zuzugreifen?
Ich verstehe, dass ohne Synchronisation auf die gleiche Variable Schreiben dangareous ist:
package main
type Apple struct {
color string
size uint
}
func main() {
apple := &Apple{}
go func() {
apple.color = "red"
}()
go func() {
apple.color = "green"
}()
}
Aber können Sie auf verschiedene Strukturkomponenten ohne jede Art von Synchronisation schreiben?
package main
type Apple struct {
color string
size uint
}
func main() {
apple := &Apple{}
go func() {
apple.color = "red"
}()
go func() {
apple.size = 42
}()
}
Oder sollte ich chan
oder sync.Mutex
für das?
Die Absätze 1 und 3 sind großartig; Absatz 2 erscheint off-topic (weil die Sorge Sicherheit ist) und schlechter Rat (weil Go eine solche Hochsprache ist, sollten Sie den aussagekräftigsten Code standardmäßig schreiben und wo nötig von Fall zu Fall optimieren-- nicht, indem man diese Begründung allgemein anwendet, es gibt keine Garantie, dass diese Goroutines sogar von verschiedenen CPUs ausgeführt werden!). – weberc2
Stimmen Sie mit @ weberc2 überein. Während die Frage der falschen Freigabe ein Problem ist, geht es um die Änderung von 2 Variablen mit oder ohne Mutex. Das Cache-Line-Problem mit vorhanden sein, unabhängig davon, welche Antwort richtig ist, und die Lösung wäre unabhängig davon die gleiche. – JimB
@ weberc2: Lustig, weil einer der Gründe, warum ich Go mag, ist, dass es keine so hohe Sprache ist. Es kompiliert ähnlich wie C mit Garbage Collection. –