2014-10-24 3 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

동일한 채널을 사용하는 다른 goroutine은 데이터 경주가 없어야합니다. 채널은 해당 구현에 잠금 장치가 있습니다. –

+0

더 많은 코드를 제공해야합니다. – OneOfOne

답변

2

채널을 닫은 후에 채널에 기록됩니다. 단지 하나의 goroutine이 있었다고하더라도, 당신은 공황을 보게 될 것입니다. 당신이있어 무엇

package main 

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

이 다양한이지만, 하나 개의 goroutine 폐쇄, 다른 goroutine 나중에 쓰려고과 함께. 경주 감지기가 이것을 데이터 경주라고 적절하게보고하고 있습니다.

프로그램에서 채널이 닫히는 이유는 무엇입니까?