2015-09-17 2 views
1

У меня есть другой выход для println и fmt.Println в детекторе гонки, который я не мог объяснить. Я ожидал, что буду гонка, или, по крайней мере, оба, чтобы не было никакой гонки.Разный выход в детекторе гонки для println и fmt.Println

package main 

var a int 

func f() { 
    a = 1 
} 

func main() { 
    go f() 
    println(a) 
} 

И, он находит состояние гонки, как ожидалось.

0 
================== 
WARNING: DATA RACE 
Write by goroutine 5: 
    main.f() 
/home/felmas/test.go:6 +0x30 

Previous read by main goroutine: 
    main.main() 
/home/felmas/test.go:11 +0x4d 

Goroutine 5 (running) created at: 
    main.main() 
/home/felmas/test.go:10 +0x38 
================== 
Found 1 data race(s) 

Однако этот проект работает без какой-либо обнаруженной гонки.

package main 

import "fmt" 

var a int 

func f() { 
    a = 1 
} 

func main() { 
    go f() 
    fmt.Println(a) 
} 

Насколько мне известно, ни одна раса не обнаруживается вовсе не означает, что никакой гонки так не это один из этих недостатков или есть более глубокое объяснение, поскольку println является встроенной и совершенно особенным?

+4

Это только случайно. Искатель гонки не видит, что гонка f() не выполняется. – JimB

+0

@JimB Если я добавлю 'time.Sleep', чтобы ждать, гонка пока не годится, а 1 -' f'. –

+1

Я вижу. Хотя ваш тест неверен (и сон не является гарантией того, что goroutine будет работать), копирование значения в интерфейс, похоже, вызывает это любопытное поведение. (BTW у детектора гонки гарантировано только отсутствие ложных срабатываний, поэтому он может иногда пропускать вещи) – JimB

ответ

0

Детектор гонки - это инструмент динамического тестирования и никакого статического анализа. Чтобы получить надежные результаты от детектора гонки, вы должны бороться за высокое тестовое покрытие своей программы, предпочтительнее писать множество benchmarks, используя несколько процессов (установив GOMAXPROCS> 1, GOMAXPROCS = NumCPU по умолчанию для Go 1.5) и используйте инструмент непрерывной интеграции, который регулярно выполняет эти тесты.

Извещатель гонки не сообщает о каких-либо ложных срабатываниях, поэтому вы должны серьезно относиться к каждой проблеме. С другой стороны, это может не обнаружить каждую гонку при каждом прогоне, в зависимости от того, будут ли запланированы горуты и процессы.

В вашем примере, обертывая все в плотной петле и повторно выполняя тесты, сообщает правильное расследование в обоих случаях.

Смежные вопросы