[go] sync 패키지의 mutex 사용법

Go 프로그래밍에서 concurrent한 동작을 관리하기 위해 sync 패키지를 사용할 수 있습니다. 이 패키지는 sync.Mutex 타입을 제공하여 여러 고루틴이 공유된 데이터에 안전하게 접근할 수 있도록 합니다.

Mutex란 무엇인가요?

MutexMutual Exclusion의 줄임말로, 고루틴이 공유된 자원에 접근할 때 동시에 접근하지 못하도록 막는 동시성 제어 방법입니다. 즉, 하나의 고루틴이 mutexlock하면 다른 고루틴은 lockunlock할 때까지 기다려야 합니다.

sync.Mutex 사용법

다음은 sync.Mutex의 간단한 사용 예제입니다.

package main

import (
	"fmt"
	"sync"
)

var counter int
var mutex sync.Mutex

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go incrementCounter(&wg)
	}
	wg.Wait()
	fmt.Println("Final counter:", counter)
}

func incrementCounter(wg *sync.WaitGroup) {
	mutex.Lock() // 공유된 자원에 대한 잠금
	defer mutex.Unlock() // 함수가 끝나기 직전에 잠금 해제
	counter++ // 공유된 자원 조작
	wg.Done()
}

위의 예제에서 sync.Mutex를 사용하여 counter 변수를 안전하게 증가시키는 방법을 보여줍니다. 역시나 mutex.Lock()으로 lock을 걸고, mutex.Unlock()으로 lock을 해제합니다.

결론

sync.Mutex를 사용하여 concurrent한 고루틴에서 shared data에 안전하게 접근할 수 있습니다. 올바른 방법으로 사용하면 고루틴 간에 데이터의 race condition을 방지할 수 있습니다.

고루틴과 sync.Mutex에 대한 더 많은 정보는 공식 Go 문서에서 확인할 수 있습니다.