Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

Code Habit

Go ) sync.Mutex 본문

카테고리 없음

Go ) sync.Mutex

코드베어 2020. 6. 10. 09:20

뮤텍스는 여러 고루틴이 공유하는 데이터를 보호할 때 사용하며 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같은 이상한 결과가 나왔을 것이다.