2014-11-19 2 views
1

내가 var100 내가
Golang의 여러 변수에 별도의 뮤텍스를 적용하는 방법은 무엇입니까?

type var1WithMutex struct { 
    mu  sync.Mutex 
    var1  int 
} 
func (v *var1) Set(value int) { 
    v.mu.Lock() 
    v.var1 = value 
    v.mu.Unlock() 
} 
func (v *var1) Get() (value int) { 
    v.mu.Lock() 
    value = v.var1 
    v.mu.Unlock() 
    return 
} 

이 유사 VAR1, VAR2, VAR3 같은 변수의 수백, 거기에이 방법을 사용하여 상호 배타적 만들고 싶어 여러 변수를 ....이
내가 어떻게 모든 어떻게해야합니까 이 코드를 반복하지 않고 상호 배타적입니까?
var1, var2, var3 등은 배열의 일부가 아니며 서로 관련이 없습니다. var2는 int 일 수 있으며 var3은 User {}입니다.

+0

세분화 된 잠금이 필요합니까? 그룹으로 잠그는 일종의 컨테이너에 모든 것을 래핑 할 수 있습니다. 그렇지 않으면 모든 변수에 대해 잠금을 원할 경우 모든 변수에 대해 잠금을 작성해야합니다. 코드 생성과'go gen'을 살펴볼 수도 있습니다. – JimB

+2

혼란 스러워요. var1 유형의 모든 변수는 자체 뮤텍스로 보호됩니다. 'var1'은 변수가 아니라 유형입니다. Get에서 읽은 내용을 잠그는 요령은 무엇입니까? 뮤텍스로 보호해야하는 수백 가지 유형이있는 이유는 무엇입니까? 그냥하지 마. – Volker

+0

@Volker 거기에 두 개의 var1 먼저 "유형"및 구조체 내부에 int 변수가있었습니다. 나는 int var1에 대해 이야기하고 있었다. 이제 유형 이름을 var1WithMutex로 업데이트했습니다. 이제 조금은 분명해. 그런데 ogc-nick이 뒤 따르는 접근법을 찾고있었습니다. 근본적 이었지만 그 순간에 나에게 찾아 오지 않았습니다. –

답변

0

각 유형마다 다른 Mutex 객체를 만들 수 있습니다. Playground

type MutexInt struct { 
    sync.Mutex 
    v int 
} 

func (i *MutexInt) Get() int { 
    return i.v 
} 

func (i *MutexInt) Set(v int) { 
    i.v = v 
} 

그리고 당신은, 당신의 변수를 포장하고 공유 뮤텍스를 사용할 수있는이

func main() { 
    i := MutexInt{v: 0} 
    i.Lock() 
    i.Set(2) 
    fmt.Println(i.Get()) 
    i.Unlock() 
} 
+1

이것은 명시 적으로 잠금 및 잠금 해제해야하는 것을 제외하고는 원래 코드와 다르지 않습니다. 또한,'sync.Mutex'의 0 값을 다시 초기화 할 필요가 없습니다. 그냥'i : = MutexInt {v : 0}'를 만드십시오. – JimB

+0

고마워, 나는 비슷한 접근법을 찾고 있었다. 대답을 편집 했으므로 동료 검토 후 표시됩니다. –

+0

@JimB 뮤텍스 개체의 사용자가 잠금/잠금 해제해야하지 않습니까? 자물쇠가 get/set 메서드 내부에 들어가는 이유는 무엇입니까? –

2

처럼 사용 모두 동일한 인터페이스 (http://play.golang.org/p/xri2M-rtEY)이있는 경우 :

type Var interface { 
    Get() int 
    Set(n int) 
} 

func Sync(v Var, m *sync.RWMutex) Var { 
    return &syncedVar{ 
     v: v, 
     m: m, 
    } 
} 

type syncedVar struct { 
    m *sync.RWMutex 
    v Var 
} 

func (v syncedVar) Get() int { 
    v.m.RLock() 
    defer v.m.RUnlock() 
    return v.v.Get() 
} 

func (v *syncedVar) Set(n int) { 
    v.m.Lock() 
    defer v.m.Unlock() 
    v.v.Set(n) 
} 
0

하는 경우를 변수가 기본 데이터 유형 (int, float, ..) 인 경우 sync.atomic 패키지를 사용하십시오. 원자 적 연산에는 뮤텍스가 필요하지 않습니다.

관련 문제