Próbuję zrozumieć, co się dzieje, gdy uzyskujesz równoczesny dostęp do metod wskaźników?Przejdź do współbieżnego dostępu do metod wskaźników
Mam mapę wskaźników i spawn off kilka procedur go. Przechodzę mapę do każdego rutynowego programu, a każda rutynowa procedura używa jednej z wartości na mapie. Nic nie jest zapisywane na mapie tylko odczytywane.
Mapa jest małe, tylko 4 przyciski więc jest możliwe, że więcej niż jeden przejdź rutynowe będzie przy użyciu tej samej wartości z mapy.
Pytanie jest, co się dzieje, gdy Two Go procedury wywołać metodę z tego samego wskaźnika? Czy otrzymam nieprzewidywalne wyniki?
EDIT
Przykład: Biorę się fragment mapy jak to nie jest pytanie jestem po.
Mam foo
, który jest wskaźnikiem typu MyStruct
i ta struktura ma metodę DoSomething
, która pobiera argumenty. W funkcji main
tworzę dwa go routines
i oba wywołują foo.DoSomething
przekazując różne wartości. W tym przykładzie, pierwsza rutynowa procedura ma znacznie większe obliczenia niż preforma (wystarczy użyć tutaj godzin snu do symulacji obliczeń). Znowu nic w strukturze się nie zmienia. Wezwę tylko metodę konstrukcji. Czy muszę się martwić drugim rutynowym nawiązywaniem połączenia z numerem foo.DoSomething
, gdy pierwsza procedura go działa nadal działa z tą metodą?
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))
}
Dziękuję za poświęcony mi czas, ale nie jest to dokładnie to, o co prosiłem. Dodałem edycję z kodem przykładu, do którego próbuję się dostać. Przepraszamy za jakiekolwiek zamieszanie. – Jeff
@Jeff Tak więc moja odpowiedź brzmi: "Jeśli wartość jest zawsze tylko do odczytu (nigdy się nie zmieni), możesz czytać z wielu procedur, jak chcesz.". Nie musi być specyficzna dla mapy - jest wskaźnikiem. To samo dotyczy. – Luke