ポインターメソッドに同時アクセスするとどうなるかを理解しようとしていますか?
ポインターのマップがあり、いくつかの go ルーチンを生成します。各 go ルーチンにマップを渡すと、各 go ルーチンはマップ内の値の 1 つを使用します。読み取られるだけのマップには何も書き込まれません。
マップは小さく、4 つのキーしかないため、複数の go ルーチンがマップから同じ値を使用する可能性があります。
質問は、2 つの go ルーチンが同じポインターのメソッドを呼び出すとどうなるかということです。予測できない結果が得られますか?
編集
例: マップの部分を取り出しているのは、それは私が求めている質問ではないからです。
私はfoo
これが型のポインタでMyStruct
あり、この構造にDoSomething
は引数を取るメソッドがあります。main
関数で 2 つ作成していますが、両方とも異なる値を渡すgo routines
呼び出しを行います。foo.DoSomething
この例では、最初の go ルーチンは 2 番目のルーチンよりもはるかに大きな計算を実行します (ここではスリープ時間を使用して計算をシミュレートしています)。繰り返しますが、構造体は何も変更されていません。構造体メソッドを呼び出しているだけです。foo.DoSomething
最初の go ルーチンがまだメソッドを操作しているときに、2 番目の go ルーチンが を呼び出すことを心配する必要はありますか?
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))
}