[go] sync 패키지를 이용한 병행성 제어

병행성은 현대 소프트웨어 시스템에서 매우 중요한 요소입니다. Go 언어는 병행성을 강력하게 지원하며, sync 패키지를 통해 고루틴들 간의 동기화와 공유 자원 관리를 할 수 있습니다. 이번 포스트에서는 sync 패키지를 사용하여 병행성을 제어하는 방법에 대해 알아보겠습니다.

WaitGroup을 사용한 고루틴 관리

sync.WaitGroup은 여러 고루틴이 모두 실행을 마칠 때까지 대기할 수 있도록 해주는 도구입니다. 아래는 sync.WaitGroup을 사용하여 고루틴을 관리하는 간단한 예제 코드입니다.

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			fmt.Println("고루틴", id, "실행 중")
		}(i)
	}

	wg.Wait()
	fmt.Println("모든 고루틴이 실행 완료됨")
}

위의 예제 코드에서 sync.WaitGroup을 사용하여 5개의 고루틴이 모두 실행을 마칠 때까지 기다리고, 마지막에 “모든 고루틴이 실행 완료됨”을 출력합니다.

Mutex를 사용한 공유 자원 보호

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

package main

import (
	"fmt"
	"sync"
)

var (
	counter = 0
	mutex   sync.Mutex
)

func incrementCounter() {
	mutex.Lock()
	defer mutex.Unlock()
	counter++
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			incrementCounter()
		}()
	}
	wg.Wait()
	fmt.Println("최종 카운터 값:", counter)
}

위의 예제 코드에서 sync.Mutex를 사용하여 counter 변수에 대한 접근을 보호하고, 10개의 고루틴이 incrementCounter 함수를 안전하게 호출하도록 합니다.

정리

Go 언어의 sync 패키지를 사용하면 병행성을 효율적으로 제어할 수 있습니다. sync.WaitGroup을 사용하여 고루틴의 동시 실행 완료를 기다리고, sync.Mutex를 사용하여 공유 자원을 안전하게 보호할 수 있습니다. 이러한 기능들을 적절히 활용하여 안정적이고 효율적인 병행 프로그램을 개발할 수 있습니다.

더 자세한 내용은 Go 공식 문서를 참조하세요.