Поиск…
Блокировка Mutex
Блокировка Mutex в Go позволяет гарантировать, что только один goroutine за один раз имеет блокировку:
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()
}
Использование Mutex
позволяет избежать условий гонки, одновременных модификаций и других проблем, связанных с несколькими параллельными программами, работающими на одних и тех же ресурсах. Обратите внимание, что Mutex.Unlock()
может выполняться любой процедурой, а не только процедурой, которая получила блокировку. Также обратите внимание, что вызов Mutex.Lock()
не будет Mutex.Lock()
, если другая процедура удерживает блокировку; он блокируется до тех пор, пока блокировка не будет отпущена.
Совет. Всякий раз, когда вы передаете переменную Mutex в функцию, всегда передавайте ее как указатель. В противном случае копия будет сделана из вашей переменной, которая побеждает цель Mutex. Если вы используете более старую версию Go (<1.7), компилятор не предупредит вас об этой ошибке!