[go] sync 패키지를 이용한 동기화 기법

Go 언어에서는 sync 패키지를 사용하여 고루틴 간의 동기화를 달성할 수 있습니다. 이 패키지에는 여러 동기화 기법을 구현한 타입들이 포함되어 있어서, 고루틴의 안전한 동시 실행을 보장할 수 있습니다.

WaitGroup

sync.WaitGroup은 여러 고루틴이 모두 완료될 때까지 대기할 수 있는 기능을 제공합니다. 아래는 sync.WaitGroup을 사용하여 고루틴이 모두 종료될 때까지 기다리는 예제 코드입니다.

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		defer wg.Done()
		// ...
	}()

	go func() {
		defer wg.Done()
		// ...
	}()

wg.Wait()
fmt.Println("모든 고루틴이 종료되었습니다.")
}

Mutex

sync.Mutex는 상호 배제를 구현하기 위해 사용됩니다. 아래는 sync.Mutex를 사용하여 공유 자원에 대한 안전한 접근을 보장하는 예제 코드입니다.

package main

import (
	"fmt"
	"sync"
)

type SafeCounter struct {
	mu sync.Mutex
	v  map[string]int
}

func (c *SafeCounter) Inc(key string) {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.v[key]++
}

func (c *SafeCounter) Value(key string) int {
	c.mu.Lock()
	defer c.mu.Unlock()
	return c.v[key]
}

func main() {
	c := SafeCounter{v: make(map[string]int)}
for i := 0; i < 1000; i++ {
go c.Inc("somekey")
}

fmt.Println(c.Value("somekey"))
}

sync 패키지를 사용하여 고루틴 간의 동기화를 구현할 수 있습니다. 위의 예제는 WaitGroupMutex를 사용한 동기화 기법에 대한 기본적인 이해를 제공합니다.

자세한 내용은 공식 문서를 참고하세요.