В своем ответе на этот вопрос: Golang для неустойчивого поведения Windows? user @distributed рекомендуется блокировать/синхронизировать доступ к общей переменной в параллельных goroutines.
Как я могу это сделать?
Подробнее о проблеме:
Я получаю этот код (возвращаемая функция с закрытием на views
), работающий одновременно на нескольких goroutines:
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++
}
}
Похоже, что функция ввода-вывода занимает это время, и в результате я получаю такой вывод:
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.
Он увеличивается, но когда он печатается, я вижу, что операция print + 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)
}
}
Кажется, все нормально, но я не совсем уверен, не закончится ли это в конце концов...