2013-10-27 1 views
40

Go 언어 사양, 효과적인 Go 및 Go 메모리 모델을 간략히 살펴본 후 Go 채널이 어떻게 작동하는지에 대해서는 아직 분명하지 않습니다.이동 채널은 어떻게 구현됩니까?

어떤 종류의 구조입니까? 스레드 안전 큐/배열과 같은 종류의 행동을합니다.

구현이 아키텍처에 종속적입니까?

답변

56

채널의 소스 파일은 (소스 코드 루트에서) /src/pkg/runtime/chan.go입니다.

hchan은 채널의 중앙 데이터 구조이며 연결 목록 (goroutine 및 데이터 요소에 대한 포인터 보유) 및 closed 플래그가 있습니다. runtime2.go에 정의되어 있고 OS에 따라 뮤텍스 (futex) 또는 세마포어로 사용되는 Lock 임베디드 구조가 있습니다. 잠금 구현은 빌드 태그를 기반으로 lock_futex.go (Linux/Dragonfly/Some BSD) 또는 lock_sema.go (Windows/OSX/Plan9/Some BSD)에 있습니다.

채널 조작은 모두 chan.go 파일에 구현되어 있으므로 makechan, send 및 receive 조작은 물론 select 구조, 닫기, len 및 cap 내장 기능을 볼 수 있습니다.

채널의 내부 동작에 대한 심층적 인 설명은 Dmitry Vyukov가 직접 작성한 Go channels on steroids (Go 핵심 개발자, goroutines, 스케줄러 및 기타 채널)을 참조해야합니다.