← Назад ко всем вопросам

С помощью чего реализованы Mutex

1️⃣ Как кратко ответить

Mutex в Go реализованы с использованием низкоуровневых примитивов синхронизации, предоставляемых операционной системой, таких как атомарные операции и системные вызовы для блокировки и разблокировки потоков.

2️⃣ Подробное объяснение темы

Mutex (сокращение от "mutual exclusion" — взаимное исключение) — это механизм синхронизации, который используется для предотвращения одновременного доступа к общим ресурсам несколькими потоками. В языке программирования Go, Mutex реализован в пакете sync и предоставляет методы для блокировки и разблокировки критических секций кода.

Зачем нужен Mutex

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

Как работает Mutex

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

Пример использования Mutex в Go

package main
​
import (
	"fmt"
	"sync"
)
​
var (
	counter int
	mu      sync.Mutex
)
​
func increment(wg *sync.WaitGroup) {
	defer wg.Done()
​
	// Блокируем доступ к критической секции
	mu.Lock()
​
	// Увеличиваем значение счетчика
	counter++
​
	// Разблокируем доступ к критической секции
	mu.Unlock()
}
​
func main() {
	var wg sync.WaitGroup
​
	// Запускаем 1000 горутин, каждая из которых увеличивает счетчик
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go increment(&wg)
	}
​
	// Ожидаем завершения всех горутин
	wg.Wait()
​
	// Выводим итоговое значение счетчика
	fmt.Println("Final Counter:", counter)
}

Объяснение кода

  1. Импортируем пакеты: fmt для вывода на экран и sync для использования примитивов синхронизации.

  2. Объявляем переменные:

    • counter — общий ресурс, который будет изменяться.
    • mu — экземпляр sync.Mutex, который будет использоваться для синхронизации доступа к counter.
  3. Функция increment:

    • Использует defer wg.Done() для уменьшения счетчика WaitGroup после завершения работы горутины.
    • mu.Lock() блокирует доступ к критической секции, чтобы только одна горутина могла изменить counter в данный момент.
    • Увеличивает значение counter.
    • mu.Unlock() разблокирует доступ, позволяя другим горутинам войти в критическую секцию.
  4. Функция main:

    • Создает WaitGroup для ожидания завершения всех горутин.
    • Запускает 1000 горутин, каждая из которых вызывает increment.
    • wg.Wait() блокирует выполнение до тех пор, пока все горутины не завершат свою работу.
    • Выводит итоговое значение counter, которое должно быть 1000, если синхронизация выполнена правильно.

Mutex в Go — это мощный инструмент для управления доступом к общим ресурсам, обеспечивающий корректное выполнение многопоточных программ.

Тема: Конкурентность
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки