@ 17. 1 ~ 18/Go 랭

GO RWMutex vs Mutex

namoeye 2020. 7. 16. 00:15
var Password = secret{password: "myPassword"}

type secret struct {
	RWM      sync.RWMutex
	M        sync.Mutex
	password string
}

func Change(c *secret, pass string) {
	c.RWM.Lock()

	fmt.Println("LChange")

	time.Sleep(10 * time.Second)

	c.password = pass
	c.RWM.Unlock()
}

func show(c *secret) string {
	c.RWM.RLock()
	fmt.Println("show")
	time.Sleep(3 * time.Second)
	defer c.RWM.RUnlock()
	return c.password
}

func showWithLock(c *secret) string {
	c.M.Lock()
	fmt.Println("showWithLock")
	time.Sleep(3 * time.Second)
	defer c.M.Unlock()
	return c.password
}

func main() {
	var showFunction = func(c *secret) string { return "" }
	var waitGroup sync.WaitGroup

	//showFunction = show
	showFunction = showWithLock

	fmt.Println("Pass", showFunction(&Password))

	for i := 0; i < 15; i++ {
		waitGroup.Add(1)
		go func() {
			defer waitGroup.Done()
			fmt.Println("Go Pass", showFunction(&Password))
		}()
	}

	go func() {
		waitGroup.Add(1)
		defer waitGroup.Done()

		Change(&Password, "123456")
	}()
}

 

경우에 따라서 RWMutex가 Mutex보다 더 빠르다는걸 보여주는데

위에 showWithLock() 함수는 하나의 고루틴이 한번씩 showWithLock에 접근해서 읽을 수 있기 때문이다

 

위에 한가지를 더 보면 show함수로 호출할떄는 쓰기 락이 잠금 된상태에서 (Change함수 호출) show함수가 블락이 되는데

showWithLock을 쓸경우 다른 뮤텍스 변수라 쓰기를 하던말던 showWithLock로 계속 읽는다 

단 위에 이미 이야기 했듯이 읽을떄 하나의 고루틴에서 하나의 함수만 읽을 수 있다