Как mutex.Lock () знает, какие переменные нужно заблокировать? - PullRequest
0 голосов
/ 23 июня 2019

Я новичок, поэтому, пожалуйста, будьте нежны.

Итак, я использую мьютексы в некоторых моих кодах уже пару недель. Я понимаю концепцию, лежащую в основе этого: заблокировать доступ к определенному ресурсу, взаимодействовать с ним (читать или писать), а затем снова разблокировать его для других.

Код мьютекса, который я использую, в основном копируется-вставляется-настраивается. Код работает, но я все еще пытаюсь обернуть голову вокруг его внутренней работы. До сих пор я всегда использовал мьютекс в структуре для блокировки структуры. Сегодня я нашел этот пример , что сделало для меня совершенно неясным, что на самом деле блокирует мьютекс. Ниже приведен фрагмент кода примера:

var state = make(map[int]int)

var mutex = &sync.Mutex{}

var readOps uint64
var writeOps uint64

// Here we start 100 goroutines to execute repeated reads against the state, once per millisecond in each goroutine.
for r := 0; r < 100; r++ {
    go func() {
        total := 0
        for {
            key := rand.Intn(5)
            mutex.Lock()
            total += state[key]
            mutex.Unlock()
            atomic.AddUint64(&readOps, 1)

            time.Sleep(time.Millisecond)
        }
    }()
}

Что меня здесь озадачивает, так это то, что между мьютексом и значением, которое он должен заблокировать, похоже, нет никакой связи. До сегодняшнего дня я думал, что мьютекс может заблокировать определенную переменную, но, глядя на этот код, кажется, что вся программа блокирует выполнение только строк под блокировкой, пока разблокировка не будет запущена снова. Я полагаю, это означает, что все другие программы были приостановлены на мгновение, пока разблокировка не будет запущена снова. Поскольку код скомпилирован, я предполагаю, что он может знать, какие переменные доступны между lock() и unlock(), но я не уверен, так ли это.

Если все другие программы на мгновение останавливаются, это не похоже на настоящую многопроцессорность, поэтому я предполагаю, что не понимаю, что происходит.

Может ли кто-нибудь помочь мне понять, как компьютер знает, какие переменные он должен блокировать?

1 Ответ

5 голосов
/ 23 июня 2019

заблокировать доступ к определенному ресурсу, взаимодействовать с ним (читать или писать), а затем снова разблокировать его для других.

В основном да.

Что меня здесь озадачивает, так это то, что между мьютексом и значением, которое он должен блокировать, похоже, нет никакой связи.

Mutex - это просто объект взаимного исключения, который синхронизирует доступ к ресурсу,Это означает, что если две разные программы хотят заблокировать мьютекс, только первый может получить к нему доступ.Вторая программа теперь ждет неопределенно долго, пока она сама не сможет заблокировать мьютекс.Нет никакой связи с переменными, вы можете использовать мьютекс по своему усмотрению.Например, только один запрос http, только одна операция чтения / записи базы данных или только одно присвоение переменной.Хотя я не советую использовать мьютекс для этих примеров, общая идея должна стать ясной.

, но, глядя на этот код, кажется, что вся программа блокирует выполнение только строк подблокировка, пока разблокировка не будет запущена снова.

Не вся программа, только каждая программа, которая хочет получить доступ к тому же мьютексу, ждет, пока сможет.

Полагаю, это означает, что все другие программы были приостановлены на мгновение, пока разблокировка не будет запущена снова.

Нет, они не делают паузу.Они выполняются до тех пор, пока не захотят получить доступ к одному и тому же мьютексу.

Если вы хотите сгруппировать свой мьютекс конкретно с переменной, почему бы не создать структуру?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...