goroutine は OS thread も使う

goroutine は GOMAXPROCS >= 2 の場合は OS の thread も使って動くので、

そもそもgoroutineはスレッドじゃない。
そう、goroutineはスレッドじゃない。

Big Sky :: 非同期UI

この部分はちょっと誤解を招くかもなあと思いました。

実際に複数の 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