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!