Про мютексы в golang
Мьютекс в golang - это способ синхронизации доступа к общим ресурсам, которые могут быть одновременно использованы несколькими горутинами.
Мьютекс имеет два состояния:
Заблокирован
Разблокирован
Когда мьютекс заблокирован, любая горутина, которая пытается его заблокировать, будет ждать, пока мьютекс не будет разблокирован.
Для работы с мьютексами в golang используется пакет sync, который предоставляет тип sync.Mutex. У мьютекса есть методы Lock() и Unlock(), которые позволяют блокировать и разблокировать доступ к общему ресурсу. Например, если у нас есть переменная counter, которая может быть изменена несколькими горутинами, то мы можем использовать мьютекс для защиты ее значения от гонки данных. Вот пример кода, который демонстрирует это:
package main
import (
"fmt"
"sync"
)
var counter int = 0 // общий ресурс
var mutex sync.Mutex // мьютекс
func main() {
ch := make(chan bool) // канал
for i := 1; i < 5; i++ {
go work(i, ch) // запускаем горутину
}
for i := 1; i < 5; i++ {
<-ch // ожидаем завершения горутины
}
fmt.Println("The End")
}
func work(number int, ch chan bool) {
mutex.Lock() // блокируем мьютекс
counter = 0 // сбрасываем значение счетчика
for k := 1; k <= 5; k++ {
counter++ // увеличиваем счетчик
fmt.Println("Goroutine", number, "-", counter) // выводим результат
}
mutex.Unlock() // разблокируем мьютекс
ch <- true // отправляем сигнал в канал
}
Этот код гарантирует, что только одна горутина имеет доступ к переменной counter в один момент времени, и выводит корректный результат.
Интересные факты и фичи языков программирования у нас в канале, заходи :)
Arduino & Pi
1.5K поста20.8K подписчика
Правила сообщества
В нашем сообществе запрещается:
• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)
• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском
• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)
• Рассуждать на темы политики
• Нарушать установленные правила Пикабу