Sto cercando di capire cosa succede quando si accede in modo concorrente a un metodo di puntatori?Accesso simultaneo ai metodi dei puntatori
Ho una mappa di puntatori e genera alcune routine di go. Passo la mappa in ciascuna routine di go e ogni routine userà uno dei valori nella mappa. Nulla viene scritto sulla mappa solo da cui viene letto.
La mappa è piccola, solo 4 tasti, quindi è possibile che più di una routine di go utilizzerà lo stesso valore dalla mappa.
La domanda è, cosa succede quando due routine di go chiamano un metodo dello stesso puntatore? Otterrò risultati imprevedibili?
EDIT
Esempio: Sto prendendo la porzione mappa come non è questo il problema che sto cercando.
Ho foo
che è un puntatore del tipo MyStruct
e questa struttura ha un metodo DoSomething
che accetta gli argomenti. Nella funzione main
sto creando due go routines
ed entrambi fanno chiamate a foo.DoSomething
passando valori diversi. In questo esempio, la prima routine di go ha un calcolo molto più grande rispetto alla seconda (utilizzando semplicemente i tempi di sospensione qui per simulare i calcoli). Di nuovo, nulla nella struttura sta cambiando. Sto solo facendo una chiamata al metodo delle strutture. Devo preoccuparmi che la routine di seconda uscita effettui una chiamata a foo.DoSomething
quando la prima routine di go sta ancora lavorando con il metodo?
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))
}
grazie per il vostro tempo nell'aiutarmi, ma questa non è esattamente la domanda che cercavo. Ho aggiunto una modifica con un esempio di codice di ciò che sto cercando di ottenere. Ci scusiamo per qualsiasi confusione. – Jeff
@Jeff Così come dice la mia risposta, "Se il valore è sempre di sola lettura (non cambierà mai), puoi leggere da quante routine go vuoi.". Non deve essere specifico per la mappa: è un puntatore. Lo stesso vale. – Luke