・데드락(Deadlock) : 교착상태
-> 둘 이상의 프로세스(함수)가 서로 가진 한정된 자원을 요청하는 경우 발생하는 것으로, 프로세스가 진전되지 못하고 모든 프로세스가 대기 상태가 되는 것을 말함
위 이미지의 c라는 string 형 채널을 생성하고 데이터를 보내고 있는데 데이터를 받는 수신자(수신 루틴)가 없기 때문에 값을 수신할 때까지 무한 대기하는 데드락이 발생했다. 그래서 송/수신을 위한 고루틴을 만들고 수신자와 송신자의 요건을 충족시키면 데드락 상황이 발생하지 않고 프로그램이 실행된다.
버퍼
*버퍼를 만드는 형식
make(chan 데이터타입, 버퍼개수)
비동기 채널 버퍼에서 고루틴의 대기 조건
송신자는 수신자가 직접 데이터를 받을 때 까지 대기하지 않고 버퍼에 값을 보내가만 하면 다음 코드를 실행하기 때문에 훨씬 효율이 높아진다.물론 버퍼가 가득차서 가득 차서 더이상 송신할 수 없을 때는 다음 코드를 실행하지 않고 채널에 묶어 버린다.(무한 대기 상태)
또한 main() 함수의 수신 루틴은 한개 받고 한개를 처리할 필요 없이 버퍼에 값이 있으면 바로바로 꺼내 쓴다.
똑같이 더 이상 버퍼에 값이 송신되지 않으면 수신 루틴은 무한 대기 상태가 되고 main()함수에서는 데드락이 발생합니다.따라서 송/수신 채널의 개수를 잘 맞춰줘야한다.
동기 채널 방식을 사용하면 송신자는 수신자가 데이터를 수신할 때까지 대기하고, 수신자는 송신자가 데이터를 송신할 때 까지 대기한다. (위 이미지 참조)
데이터 수신시에 송신된 데이터가 없을 경우에 채녈에서 데이터를 수신하면 무한대기상태가 되는데 채널에 데이터를
송신한 후 채널을 닫으면 해당 채널로는 더이상 데이터를 송신할 수 없지만 채널이 닫힌 후에 계속 수신이 가능하다
채널을 닫을 때는 close(채널이름)형식을 사용한다
*close없이 실행을 했을 시(데드락 발생)
*close생성 후 실행 시(정상실행)
송/수신 채널의 활용
: 채널을 사용하기 위해서는 꼭 해당 루틴에 채널이 있어야 한다
한 루틴은 채널에 두 데이터를 송신하는 역할을 하고 한 루틴은 채널에 있는 데이터를 수신해서 새로운 채널에 두 데이터를 더한 값을 메인 루틴에 송신한다.
실제 코드를 살펴보자