goroutine は GOMAXPROCS >= 2 の場合は OS の thread も使って動くので、
そもそもgoroutineはスレッドじゃない。
そう、goroutineはスレッドじゃない。
この部分はちょっと誤解を招くかもなあと思いました。
実際に複数の goroutine から共有変数を書き換えるようなコードを GOMAXPROCS >= 2 で動かすと、衝突したりします。
package main import ( "runtime"; "fmt"; ) func main() { incr(1); incr(2); } func incr(procs int) { runtime.GOMAXPROCS(procs); num := 0; wait := make(chan int); go func() { for i := 0; i < 1e9; i++ { num++; } wait <- 1; }(); go func() { for i := 0; i < 1e9; i++ { num++; } wait <- 1; }(); <- wait; <- wait; fmt.Printf("GOMAXPROCS=%d num=%d\n", procs, num); }
実行結果。
GOMAXPROCS=1 num=2000000000 GOMAXPROCS=2 num=1056216515