반응형

고루틴 호출과, 변수 접근 시 뮤텍스 이용하는 예제

 

package main

import (
	"fmt"
	"sync"
)

// 전역변수 선언
var (
	c   = make(chan int)
	a   string
	wg  sync.WaitGroup
	mux sync.Mutex
)

func myFunc() {
	defer wg.Done() // 고루틴이 종료될 때 WaitGroup 감소(0은 종료)

	mux.Lock() // a 변수 값 변경 전에 뮤텍스 잠금
	a = "hello, world"
	mux.Unlock() // 뮤텍스 잠금 해제

	<-c // 채널에서 값 가져와서 버림, 채널이 비었으면 대기 (저장하려면, data := <-c)
}

func main() {
	wg.Add(1)   // 고루틴 1개 대기
	go myFunc() // 함수를 고루틴 실행

	c <- 0 // 채널에 값 추가 (고루틴이 실행됨)

	wg.Wait() // 모든 고루틴 종료 대기

	mux.Lock() // 안전하게 a 변수에 접근하려고 뮤텍스 잠금
	fmt.Println(a)
	mux.Unlock() // 뮤텍스 잠금 해제
}

 

반응형

+ Recent posts