この質問に対する彼の答えの中で: Golang for Windowsの不安定な動作? ユーザー@distributedは、同時実行のgoroutineで共有変数へのアクセスをロック/同期することをお勧めします。
どうやってやるの?
この問題の詳細:
このコード(クロージャーがオンになっている戻り関数views
)を複数のゴルーチンで同時に実行します。
func makeHomeHandler() func(c *http.Conn, r *http.Request) {
views := 1
return func(c *http.Conn, r *http.Request) {
fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views)
views++
}
}
IO関数には時間がかかるようです。その結果、次のような出力が得られます。
Counting monkeys, 5 so far.
Counting monkeys, 5 so far.
Counting monkeys, 5 so far.
Counting monkeys, 8 so far.
Counting monkeys, 8 so far.
Counting monkeys, 8 so far.
Counting monkeys, 11 so far.
正常にインクリメントしますが、印刷されると、printing+incrementingの操作がまったくアトミックではないことがわかります。
次のように変更した場合:
func makeHomeHandler() func(c *http.Conn, r *http.Request) {
views := 0
return func(c *http.Conn, r *http.Request) {
views++
// I can only hope that other goroutine does not increment the counter
// at this point, i.e., right after the previous line and before the
// next one are executed!
views_now := views
fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views_now)
}
}
正常に動作しているようですが、最終的に失敗しないかどうかは完全にはわかりません...