45. sync.Mutex 배제 및 배제 잠금

2066 단어
channel은 고로틴에서 서로 통신하는 것이 매우 적합하고 편리하다.만약 우리가 서로 통신할 필요가 없다면, 충돌을 피하기 위해 같은 시간에 고루틴 접근 공유 변수가 하나만 있을 수 있음을 보장할 수 있을 뿐이다.우리 어떻게 해야 되지?이것은 상호 배척과 상호 배척 자물쇠를 사용해야 한다.go 언어 표준 라이브러리에서sync를 제공합니다.Mutex 유형과 두 가지 방법: Lock과 Unlock 우리는 코드 앞에 Lock을 붙이고 코드 뒤에 Unlock을 붙이는 방법을 통해 코드가 실행될 때의 상호 배척성을 확보할 수 있다.
    c.mux.Lock()    
    c.v[key]++      //Lock  ,         goroutine     c.v
    c.mux.Unlock()

defer 문구로 상호 배척 자물쇠가 반드시 잠금 해제될 것을 보장할 수도 있다.
    c.mux.Lock()
    defer c.mux.Unlock()

코드 예시를 만들고 계수기 구조체를 만듭니다
//     ,   sync.Mutex     
type SafeCounter struct {
    v map[string]int
    mux sync.Mutex
}

v는 계수기 맵에 sync를 추가합니다.Mutex 유형SafeCounter에 두 가지 방법을 추가합니다. 하나는 inc로 계수기 값을 누적하고, 하나는Value로 현재 계수기 값을 가져옵니다.
//      key     
func (c *SafeCounter) Inc(key string)  {
    c.mux.Lock()
    //Lock  ,         goroutine     c.v
    c.v[key]++
    c.mux.Unlock()
}
//        
func (c *SafeCounter) Value(key string) int {
    c.mux.Lock()
    defer c.mux.Unlock()
    return c.v[key]
}

주 함수는 100번 순환하고, 고루틴을 사용하여 계수기를 증가시킵니다.그리고 현재 계수기의 값을 얻습니다.너무 빨리 실행되어 효과가 보이지 않도록 매번 순환은 100밀리초 간격으로 해야 한다.
time.Sleep(100*time.Millisecond)

전체 코드 예
package main

import (
    "sync"
    "fmt"
    "time"
)

//     ,   sync.Mutex     
type SafeCounter struct {
    v map[string]int
    mux sync.Mutex
}

//      key     
func (c *SafeCounter) Inc(key string)  {
    c.mux.Lock()
    //Lock  ,         goroutine     c.v
    c.v[key]++
    c.mux.Unlock()
}

//        
func (c *SafeCounter) Value(key string) int {
    c.mux.Lock()
    defer c.mux.Unlock()
    return c.v[key]
}
func main() {
    c := SafeCounter{v:make(map[string]int)}
    for i := 0; i < 100; i++{
        go c.Inc("somekey")
        time.Sleep(100*time.Millisecond)
        fmt.Println(c.Value("somekey"))
    }
    fmt.Println(c.Value("somekey"))
}

실행 결과가 너무 길어서 전시를 하지 않습니다.스스로 실천하세요.

좋은 웹페이지 즐겨찾기