일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준
- Docker
- go channel
- tour of go
- JUCE 튜토리얼
- C++ gui
- 연결리스트
- 리듬게임
- vim-go
- C++
- 코딩
- 프로그래밍
- Nebula
- 공룡책
- OS
- JUCE
- C++ gui 라이브러리
- C++ library
- 알고리즘
- LOB
- BOJ
- go
- 운영체제
- c++ heap
- a tour of go
- C언어
- JUCE library
- 자료구조
- JUCE라이브러리
- gui
- Today
- Total
CafeM0ca
[Go] Goroutine과 channel 본문
고루틴은 경량 스레드로 go runtime에 관리된다.
고루틴은 같은 주소 공간에서 동작하며 공유 메모리에서 반드시 싱크로되어 접근한다.
위에가 고루틴 소스코드인데 go 키워드를 사용해서 함수를 호출하면 된다. 진짜 심플해서 좋은 것 같다.
Channel이라는 문법이 있는데, 채널은 데이터를 주고 받을 수 있는 통로다. 왼쪽 화살표가 채널의 연산자다.
맵과 슬라이스처럼 채널은 반드시 생성되면서 선언해줘야 한다.
기본적으로, 보내는 쪽과 받는 쪽은 다른쪽이 준비 될 때까지 block된다.
채널은 고루틴이 명시적으로 lock이나 condition variable(cafemocamoca.tistory.com/221)없이 동기화를 가능하게 해준다. (고루틴에서 자주 사용한다는 말)
예제를 보면 16번째줄에서 채널을 생성하고 sum함수를 2번 호출해서 s의 절반씩 계산한다.
10번째줄에서 sum의 결과를 채널 변수 c로 받고 19번쨰줄에서 그 결과를 바로 x,y에 집어넣어준다.
Buffered Channel은 이름 그대로 채널에 버퍼를 할당할 수 있다. 만들 땐 무조건 make로 만들어야 한다.
예제를 보면 6번째줄에서 ch는 버퍼가 2인 채널을 만들고 있다.
채널에 데이터를 1,2를 순서대로 집어넣고 있고 출력시 1과 2가 순서대로 출력된다.
보내는쪽은 buffered channel의 버퍼가 꽉 차야 block할 수 있다.
받는 쪽은 버퍼가 비어있어야 block한다.
range로 채널 접근과, select에 대한 내용을 썼는데 글이 날라가는 바람에 아래의 링크로 대체한다.
golang.site/go/article/22-Go-채널
'Programming > Go' 카테고리의 다른 글
[Go] Mutex (0) | 2020.12.08 |
---|---|
[Go] A tour of go Exercise: Equivalent Binary Trees 풀이 (0) | 2020.12.08 |
[Go] A tour of Go exercise Reader, rot13Reader 풀이 (0) | 2020.12.06 |
[Go] A Tour of Go Exercise : Stringers 풀이 (0) | 2020.12.05 |
[Go] Type assertion, Type switch (0) | 2020.12.04 |