2014-10-24 1 views
1

я столкнулся гонки данных, как этотЕсть ли гонка данных, когда вы отправляете сообщение на канал и закрываете его?

WARNING: DATA RACE 
11652 Read by goroutine 14: 
11653 runtime.chansend() 
11654  /usr/local/go/src/pkg/runtime/chan.c:155 +0x0 
      ... 
11657 
11658 Previous write by goroutine 13: 
11659 runtime.closechan() 
11660  /usr/local/go/src/pkg/runtime/chan.c:1232 +0x0 
      ... 

канал имеет блокировку, почему там гонки данных?

+0

Я вижу две разные процедуры, один отправляет и один закрывается. Это, скорее всего, гонка данных. Что вы имеете в виду, говоря, что канал имеет замок? Вы указали бы соответствующий код? –

+0

У другой горутин, использующей тот же канал, не должна быть гонка данных. канал имеет блокировку в своих инструментах. –

+0

вам нужно предоставить больше кода. – OneOfOne

ответ

2

Канал записывается после того, как он был закрыт. Даже если бы был только один горутин, вы бы заметили панику.

package main 

func main() { 
    c := make(chan struct{}) 
    close(c) 
    c <- struct{}{} // should panic! 
} 

Что у вас есть выбор, но с одним закрытием goroutine, а другой goroutine пытается написать потом. Детектор гонки должным образом сообщает об этом как гонку данных.

Почему канал закрыт в вашей программе?

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