[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
패키지를 사용하여 고루틴 간의 동기화를 구현할 수 있습니다. 위의 예제는 WaitGroup
및 Mutex
를 사용한 동기화 기법에 대한 기본적인 이해를 제공합니다.
자세한 내용은 공식 문서를 참고하세요.