Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- write
- mutex
- C
- range
- http
- windows
- Linux
- Close
- Python
- 영화
- install
- Golang
- json
- Sync
- bitcoin
- FOR
- package
- File
- go언어
- tcp
- API
- 리뷰
- 책
- c++
- channel
- Callback
- go
- window
- JavaScript
- GO 언어
Archives
- Today
- Total
Code Habit
Go ) sync.Mutex 본문
뮤텍스는 여러 고루틴이 공유하는 데이터를 보호할 때 사용하며 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{} // int 형 슬라이스 생성
var mutex = new(sync.Mutex) // sync.Mutex 객체 생성
go func() {
for i := 0; i < 1000; i++ {
mutex.Lock() // 뮤텍스 잠금
data = append(data, 1) // data 슬라이스에 1 추가
mutex.Unlock() // 뮤텍스 잠금 해제
runtime.Gosched() // 다른 고루틴이 CPU를 사용할 수 있도록 양보
}
}()
go func() {
for i:= 0; i < 1000; i++ {
mutex.Lock() // 뮤텍스 잠금
data = append(data, 1) // data 슬라이스에 1 추가
mutex.Unlock() // 뮤텍스 잠금 해제
runtime.Gosched() // 다른 고루틴이 CPU를 사용할 수 있도록 양보
}
}()
time.Sleep(2 * time.Second) // 2초 대기
fmt.Println(len(data)) // 2000 : data 슬라이스의 길이
}
|
runtime.Gosched 함수는 다른 고루틴이 CPU를 사용할 수 있도록 양보한다. time.Sleep 함수보다 더 명확하단 장점이 있다.
실행결과
2000
|
뮤텍스를 사용하여 data에 서로 동시에 접근하지 않았기 때문에 2000이라는 결과가 딱 떨어졌다. 만약 뮤텍스를 사용하지 않았더라면 1297같은 이상한 결과가 나왔을 것이다.