@ 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로 계속 읽는다
단 위에 이미 이야기 했듯이 읽을떄 하나의 고루틴에서 하나의 함수만 읽을 수 있다