Я новичок, поэтому, пожалуйста, будьте нежны.
Итак, я использую мьютексы в некоторых моих кодах уже пару недель. Я понимаю концепцию, лежащую в основе этого: заблокировать доступ к определенному ресурсу, взаимодействовать с ним (читать или писать), а затем снова разблокировать его для других.
Код мьютекса, который я использую, в основном копируется-вставляется-настраивается. Код работает, но я все еще пытаюсь обернуть голову вокруг его внутренней работы. До сих пор я всегда использовал мьютекс в структуре для блокировки структуры. Сегодня я нашел этот пример , что сделало для меня совершенно неясным, что на самом деле блокирует мьютекс. Ниже приведен фрагмент кода примера:
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()
, но я не уверен, так ли это.
Если все другие программы на мгновение останавливаются, это не похоже на настоящую многопроцессорность, поэтому я предполагаю, что не понимаю, что происходит.
Может ли кто-нибудь помочь мне понять, как компьютер знает, какие переменные он должен блокировать?