PHpullh
학습 라이브러리/Go/뮤텍스 vs 채널

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 채널 학습 시 주의할 점은 무엇인가요?

채널 카운터의 관리 고루틴이 종료되지 않으면 고루틴 누수입니다. 프로그램 생명주기를 고려한 정리 메커니즘을 추가하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.