Golang

[Golang] golang 동시성 관리하기 sync 패키지 사용법

CHERMINI 2023. 2. 22.

[Golang] golang 동시성 관리하기 sync 패키지 사용법

Go에서 sync패키지는 여러 고루틴 간에 공유 리소스에 대한 액세스를 안전하게 조정하는 데 사용할 수 있는 뮤텍스, 읽기-쓰기 잠금 및 조건과 같은 기본 동기화 프리미티브를 제공합니다.

sync다음은 패키지를 사용하여 공유 리소스를 보호하는 방법에 대한 기본적인 예입니다 .

 

예제 코드

package main

import (
    "fmt"
    "sync"
)

type Counter struct {
    value int
    mu    sync.Mutex // a mutex to protect access to the shared resource
}

func (c *Counter) Inc() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.value++
}

func (c *Counter) Value() int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.value
}

func main() {
    var wg sync.WaitGroup
    c := &Counter{}
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            c.Inc()
        }()
    }
    wg.Wait()
    fmt.Println(c.Value()) // Output: 1000
}

이 예제에서는 sync.mutex 필드가 있는 Counter 구조체를 정의합니다. 구조체의 Inc() 메서드는 mutex를 유지하는 동안 값을 증가시키고 Value() 메서드 는 mutex를 유지하는 동안 현재 값을 반환합니다.

main 함수 에서 우리는 객체를 생성하고 각각의 Inc() 메서드를 호출하는 1000개의 고루틴을 생성합니다.

  • 모든 고루틴이 완료될 때까지 기다리기 위해 sync.WaitGroup 개체를 사용하고 Add() 메서드를 호출하여 각 고루틴이 생성되기 전에 카운터에 1을 추가합니다.
  • 고루틴 종료 전에 defer를 활용하여 wg.Done() 메서드를 호출하여 각 고루틴이 완료된 후 카운터에서 1을 뺍니다.
  • 마지막으로 카운터가 0에 도달할 때까지 차단하는 Wait() 메서드를 호출하여 모든 고루틴이 완료될 때까지 기다립니다.
  • 모든 고루틴이 완료된 후 main 함수가 실행을 재개하면 Value() 메서드를 사용하여 현재 value 값을 인쇄합니다.

각 고루틴은 value 값을 정확히 한 번 증가시키므로 최종 값은 1000이 되어야 합니다.

'Golang' 카테고리의 다른 글

[Golang] 난수 생성 math/rand 패키지 사용법  (0) 2023.02.23
[Golang] flag 패키지 사용법  (0) 2023.02.20
[Golang] time 패키지 사용법  (0) 2023.02.19
[Golang] golang 공부 로드맵  (0) 2023.02.17
[Golang] golang 설치하는 법  (0) 2023.02.17

댓글

💲 추천 글