[go] sync 패키지의 mutex 사용법
Go 프로그래밍에서 concurrent한 동작을 관리하기 위해 sync 패키지를 사용할 수 있습니다. 이 패키지는 sync.Mutex
타입을 제공하여 여러 고루틴이 공유된 데이터에 안전하게 접근할 수 있도록 합니다.
Mutex란 무엇인가요?
Mutex는 Mutual Exclusion의 줄임말로, 고루틴이 공유된 자원에 접근할 때 동시에 접근하지 못하도록 막는 동시성 제어 방법입니다. 즉, 하나의 고루틴이 mutex를 lock하면 다른 고루틴은 lock를 unlock할 때까지 기다려야 합니다.
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 문서에서 확인할 수 있습니다.