Szukaj…


Blokowanie Mutex

Blokowanie Mutex w Go pozwala upewnić się, że tylko jeden goroutine na raz ma blokadę:

import "sync"

func mutexTest() {
    lock := sync.Mutex{}
    go func(m *sync.Mutex) {
        m.Lock()
        defer m.Unlock()   // Automatically unlock when this function returns
        // Do some things
    }(&lock)

    lock.Lock()
    // Do some other things
    lock.Unlock()
}

Korzystanie z Mutex pozwala uniknąć warunków wyścigu, jednoczesnych modyfikacji i innych problemów związanych z wieloma równoległymi procedurami działającymi na tych samych zasobach. Zauważ, że Mutex.Unlock() może być wykonywany przez dowolną procedurę, a nie tylko procedurę, która otrzymała blokadę. Zauważ również, że wywołanie Mutex.Lock() nie zakończy się niepowodzeniem, jeśli blokada zostanie przeprowadzona przez inną procedurę; będzie blokować, dopóki blokada nie zostanie zwolniona.

Wskazówka: Ilekroć przekazujesz zmienną Mutex do funkcji, zawsze przekazuj ją jako wskaźnik. W przeciwnym razie tworzona jest kopia twojej zmiennej, co przeczy celowi Mutex. Jeśli używasz starszej wersji Go (<1.7), kompilator nie ostrzeże Cię o tym błędzie!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow