ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.