Поиск…


Блокировка 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), компилятор не предупредит вас об этой ошибке!



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow