일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- package
- tcp
- write
- json
- 리뷰
- Callback
- Sync
- FOR
- http
- Python
- JavaScript
- go언어
- bitcoin
- API
- C
- File
- mutex
- window
- windows
- GO 언어
- Close
- 영화
- install
- 책
- channel
- go
- Linux
- range
- Golang
- c++
- Today
- Total
목록분류 전체보기 (203)
Code Habit
읽기, 쓰기 뮤텍스는 읽기 동작과 쓰기 동작을 나누어 잠금(락)을 걸 수 있다. 읽기 락(Read Lock): 읽기 락끼리는 서로를 막지 않는다. 하지만, 읽기 시도 중에 값이 바뀌면 안 되므로 쓰기 락은 막는다. 쓰기 락(Write Lock): 쓰기 시도 중에 다른 곳에서 이전 값을 읽으면 안 되고, 다른 곳에서 값을 바꾸면 안 되므로 읽기, 쓰기 락 모두 막는다. sync 패키지에서 제공하는 읽기, 쓰기 뮤텍스 구조체와 함수는 다음과 같다. sync.RWMutex func(rw *RWMutex) Lock(), / func(rw* RWMutex) Unlock(); 쓰기 뮤텍스 잠금 / 잠금 해제 func(rw *RWMutex) RLock(), / func(rw *RWMutex) RUnlock(); 읽기..
윈도우가 파괴(종료)되기 전에 WM_DESTROY라는 메시지가 전달되는데 이 메시지에 대한 핸들러가 OnDestroy함수이다. 즉 WM_DESTROY 메시지가 해당 윈도우에 전달되면 OnDestroy 함수가 호출된다는 뜻이다. OnDestroy 함수가 호출되어 수행되는 시점에는 아직 윈도우가 파괴되기 전이기 때문에 해당 윈도우나 해당 윈도우에서 생성한 자식 윈도우 또는 컨트롤을 사용할 수 있다. 따라서 윈도우가 파괴되기 직전에 처리해야 할 작업이 있다면 이 함수에서 작업하면 된다. WM_DESTROY 메시지를 전달할 때 보통 윈도우 객체의 DestroyWindow() 함수를 호출 하면 된다. DestroyWindow 함수는 다음과 같은 순서로 동작한다. 파괴되는 윈도우에게 WM_DESTROY, WM_NC..
뮤텍스는 여러 고루틴이 공유하는 데이터를 보호할 때 사용하며 sync 패키지에서 제공하는 뮤텍스 구조체와 함수는 다음과 같다. sync.Mutex func (m *Mutex) Lock(): 뮤텍스 잠금 func (m *Mutex) Unlock(): 뮤텍스 잠금 해제 사용예제이다. 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 32 33 34 35 36 37 38 package main import ( "fmt" "runtime" "sync" "time" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 var data = []int{}..
Go 언어에서는 채널 이외에도 고루틴의 실행 흐름을 제어하는 동기화 객체를 제공한다. 대표적인 동기화 객체는 다음과 같다. Mutex: 상호배제(mutual exclusion)라고도 하며 여러 스레드(고루틴)에서 공유되는 데이터를 보호할 때 주로 사용한다. RWMutex: 읽기/쓰기 뮤텍스이다. 읽기와 쓰기 동작을 나누어서 잠금(락)을 걸 수 있다. Cond: 조건 변수(condition variable)이다. 대기하고 있는 하나의 객체를 깨울 수도 있고 여러 개를 동시에 깨울 수도 있다. Once: 특정 함수를 딱 한 번만 실행할 때 사용한다. Pool: 멀티 스레드(고루틴)에서 사용할 수 있는 객체 풀이다. 자주 사용하는 객체를 풀에 보관했다가 다시 사용한다. WaitGroup: 고루틴이 모두 끝날 ..
select문에서 time.After 함수를 사용하면 시간 제한 처리를 할 수 있다. time.After는 특정 시간이 지나면 현재 시간을 채널로 보낸다. package main import ( "fmt" "time" ) func main() { c1 := make(chan int) // int형 채널 생성 c2 := make(chan string) // string형 채널 생성 go func() { for { c1
Go 언어는 여러 채널을 손쉽게 사용할 수 있도록 select 분기문을 제공한다. - select { case
보내기 전용 채널과 받기 전용 채널은 값의 흐름이 한 방향으로 고정된 채널이다. 보내기 전용( send-only ): chan
채널에 값이 몇 개나 들어올지 모르기 때문에 값이 들어올 때마다 계속 꺼내기 위해 range를 사용할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package main import ( "fmt" "runtime" ) func main() { runtime.GOMAXPROCS(1) c:= make(chan int) // int 형 채널 생성 go func() { for i := 0; i