GO · 고루틴/채널
뮤텍스 vs 채널
상태 보호에는 뮤텍스, 통신과 조율에는 채널을 사용합니다. 각각의 적합한 사용 사례를 비교합니다.
고루틴/채널중급mutexchannelcomparisonstate-management
핵심 설명
상태 보호에는 뮤텍스, 통신과 조율에는 채널을 사용합니다. 각각의 적합한 사용 사례를 비교합니다.
Go code
package main
import (
"fmt"
"sync"
)
// 뮤텍스: 공유 상태 보호
type MutexCounter struct {
mu sync.Mutex
count int
}
func (c *MutexCounter) Inc() {
c.mu.Lock()
defer c.mu.Unlock()
c.count++
}
// 채널: 상태 소유권 전달
type ChannelCounter struct {
inc chan struct{}
get chan int
}
func NewChannelCounter() *ChannelCounter {
c := &ChannelCounter{
inc: make(chan struct{}),
get: make(chan int),
}
go func() { // 단일 고루틴이 상태 소유
count := 0
for {
select {
case <-c.inc:
count++
case c.get <- count:
}
}
}()
return c
}
func main() {
// 뮤텍스 방식
mc := &MutexCounter{}
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() { defer wg.Done(); mc.Inc() }()
}
wg.Wait()
fmt.Println("뮤텍스:", mc.count)
// 채널 방식
cc := NewChannelCounter()
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() { defer wg.Done(); cc.inc <- struct{}{} }()
}
wg.Wait()
fmt.Println("채널:", <-cc.get)
}학습 팁
"메모리를 공유하여 통신하지 말고, 통신하여 메모리를 공유하라" — Go 격언. 하지만 단순 카운터에는 뮤텍스가 더 간단합니다.
주의할 점
채널 카운터의 관리 고루틴이 종료되지 않으면 고루틴 누수입니다. 프로그램 생명주기를 고려한 정리 메커니즘을 추가하세요.
자주 묻는 질문
뮤텍스 vs 채널란 무엇인가요?
상태 보호에는 뮤텍스, 통신과 조율에는 채널을 사용합니다. 각각의 적합한 사용 사례를 비교합니다.
뮤텍스 vs 채널 학습 시 주의할 점은 무엇인가요?
채널 카운터의 관리 고루틴이 종료되지 않으면 고루틴 누수입니다. 프로그램 생명주기를 고려한 정리 메커니즘을 추가하세요.