[Go] Channel

Channel

Go 에서 기본 자료형으로 제공되는 채널은 goroutine끼리 통신하기 위해 사용된다.

Channel

Table of Contents

About Channel

Types of Channel

Unidirectional Channel

단방향 채널은 송신(Send only) 혹은 수신(Receive only) 한쪽의 역할만 담당하는 채널을 말한다.
<- 연산자의 위치를 통해 send only 인지 receive only 인지가 결정된다.

Bidirectional Channel

양방향 채널은 읽고(read) 쓰기(write)가 모두 가능한 채널을 일컫는다.

var bidCh chan

Buffered Channel

Unbuffered channel

↑ return to TOC

hchan struct

hchan은 채널의 중요한 자료구조이다.
이를 통해 링크드 리스트와 closed flags를 주고 받는다.

hchan 는 아래의 field 로 이루어져 있다.

type hchan struct {
  qcount   uint          
  dataqsiz uint           
  buf      unsafe.Pointer 
  elemsize uint16
  closed   uint32
  elemtype *_type 
  sendx    uint   
  recvx    uint   
  recvq    waitq 
  sendq    waitq 
  lock     mutex
}

↑ return to TOC

Close Channel

Go 에는 close 라는 내장형 함수가 존재한다.
이 함수는 채널을 닫을때 사용된다.

채널의 상태(status)를 변경하지 않고서 채널이 닫혔는지 아닌지의 여부를 확인하는 쉬운 방법은 존재하지 않는다.

↑ return to TOC

Deadlock

데드락이 발생하기 위해서는 4개의 필요충분 조건(Coffman condition)이 필요하다.

  1. Mutual Exclusion
  2. Ciruclar Wait
  3. Hold and Wait
  4. No Pre-emption

↑ return to TOC

Livelock

↑ return to TOC

Starvation

↑ return to TOC

Select

하나 이상의 채널이 존재한다면 select를 사용해보자.

↑ return to TOC

Shape of Data Flow

채널로 부터 보내지는 데이터의 흐름에 따라 종류가 나뉜다.