Ich versuche zu verstehen, was passiert, wenn Sie gleichzeitig Zugriff auf eine Zeiger Methoden machen?Go gleichzeitiger Zugriff auf Zeiger Methoden
Ich habe eine Karte von Zeigern und spawn ein paar Go-Routinen. Ich gebe die Karte in jede Go-Routine und jede Go-Routine verwendet einen der Werte in der Map. Nichts wird auf die Karte geschrieben, von der nur gelesen wird.
Die Karte ist klein, nur 4 Tasten, daher ist es möglich, dass mehr als eine Routine den gleichen Wert von der Karte verwendet.
Frage ist, was passiert, wenn zwei Go-Routinen eine Methode des gleichen Zeigers aufrufen? Werde ich unvorhersehbare Ergebnisse bekommen?
EDIT
Beispiel: Ich nehme die Karte Teil aus wie, dass ich nach dem nicht die Frage ist bin.
Ich habe foo
, die ein Zeiger des Typs MyStruct
ist und diese Struktur hat eine Methode DoSomething
, die Argumente dauert. In der main
Funktion erstelle ich zwei go routines
und beide von ihnen Anrufe zu foo.DoSomething
, die verschiedene Werte führen. In diesem Beispiel hat die erste Go-Routine eine viel größere Berechnung als die zweite (hier werden nur die Sleep-Zeiten verwendet, um Berechnungen zu simulieren). Wiederum ändert sich nichts in der Struktur. Ich rufe nur die Strukturmethode an. Muss ich mir Sorgen machen, dass die zweite Routine einen Anruf an foo.DoSomething
macht, wenn die erste Routine noch mit der Methode arbeitet?
package main
import (
"log"
"time"
)
type MyStruct struct {
}
func (self *MyStruct) DoSomething(value int) {
log.Printf("%d Start", value)
calculation_time := time.Duration(value) * time.Second
log.Printf("%d Calculating", value, calculation_time)
time.Sleep(calculation_time)
log.Printf("%d Done", value)
}
func main() {
var foo = new(MyStruct)
go foo.DoSomething(5)
// is this method call a problem when the first one is still working?
go foo.DoSomething(2)
time.Sleep(time.Duration(6 * time.Second))
}
danke für Ihre Zeit bei der Hilfe, aber das ist nicht genau die Frage, die ich suchte. Ich habe eine Bearbeitung mit einem Codebeispiel hinzugefügt, von dem ich versuche, herauszufinden. Entschuldigung für jede Verwirrung. – Jeff
@Jeff So wie meine Antwort sagt, "Wenn der Wert immer schreibgeschützt ist (wird sich nie ändern), können Sie von so vielen Routinen lesen, wie Sie wollen.". Es muss nicht kartenspezifisch sein - es ist ein Zeiger. Gleiches gilt. – Luke