Найти в Дзене

081 Мьютексы

Мьютексы, сокращение от взаимного исключения, используются в Go для синхронизации доступа к общим ресурсам, таким как память или файлы. Они позволяют только одной Goroutine одновременно получить доступ к критической секции кода, предотвращая одновременный доступ и изменение общих ресурсов несколькими Goroutine. В Go мьютексы реализуются с помощью пакета sync, который предоставляет тип Mutex для взаимного исключения. Чтобы использовать мьютекс, мы сначала создаем экземпляр Mutex, а затем используем его методы Lock() и Unlock() для блокировки и разблокировки критического участка кода соответственно. Вот пример использования мьютекса в Go: В этом примере мы определяем структуру Counter, которая содержит целочисленное значение и мьютекс. Метод Increment() в Counter блокирует мьютекс с помощью c.mu.Lock(), увеличивает значение, а затем разблокирует мьютекс с помощью defer c.mu.Unlock(). Аналогично, метод Value() блокирует мьютекс, возвращает значение и разблокирует мьютекс. В функции main()

Мьютексы, сокращение от взаимного исключения, используются в Go для синхронизации доступа к общим ресурсам, таким как память или файлы. Они позволяют только одной Goroutine одновременно получить доступ к критической секции кода, предотвращая одновременный доступ и изменение общих ресурсов несколькими Goroutine.

В Go мьютексы реализуются с помощью пакета sync, который предоставляет тип Mutex для взаимного исключения. Чтобы использовать мьютекс, мы сначала создаем экземпляр Mutex, а затем используем его методы Lock() и Unlock() для блокировки и разблокировки критического участка кода соответственно.

Вот пример использования мьютекса в Go:

Go Playground - The Go Programming Language

В этом примере мы определяем структуру Counter, которая содержит целочисленное значение и мьютекс. Метод Increment() в Counter блокирует мьютекс с помощью c.mu.Lock(), увеличивает значение, а затем разблокирует мьютекс с помощью defer c.mu.Unlock(). Аналогично, метод Value() блокирует мьютекс, возвращает значение и разблокирует мьютекс.

В функции main() мы создаем экземпляр Counter и запускаем 1000 Goroutines для увеличения значения счетчика с помощью метода Increment(). Мы используем sync.WaitGroup для ожидания завершения всех Goroutines перед печатью окончательного значения счетчика с помощью метода Value().

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