-
GO RWMutex vs Mutex@ 17. 1 ~ 18/Go 랭 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로 계속 읽는다
단 위에 이미 이야기 했듯이 읽을떄 하나의 고루틴에서 하나의 함수만 읽을 수 있다
'@ 17. 1 ~ 18 > Go 랭' 카테고리의 다른 글
GO 문법 정리(진행형) (0) 2020.07.07 GO 가변인자 (0) 2020.07.04 Go 슬라이스 (0) 2020.07.04