Mutex в Go это

Mutex в Go это

Mutex в Go это инструмент синхронизации, который используется для того, чтобы в один момент времени только одна горутина (легковесный поток выполнения) могла получить доступ к какому-либо ресурсу. Используется для предоствращения состояния гонки (race condition).

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

Mutex стоит за аббревиатурой «mutual exclusion», что в переводе означает «взаимное исключение».

sync — пакет для работы с Mutex

Основной пакет для работы с мьютексами в Go — sync. Mutex из этого пакета предоставляет два основных метода: Lock() и Unlock().

Lock() блокирует mutex, если он не заблокирован. Но ждет, если он уже заблокирован, до тех пор, пока не будет разблокирован другой горутиной.

После того как mutex заблокирован вызывающей горутиной, никакая другая горутина не может получить к нему доступ до тех пор, пока он не будет разблокирован с помощью Unlock().

Это обеспечивает безопасный доступ к данным, защищая их от одновременных изменений.

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

Пример использования mutex для безопасного обновления общих данных между горутинами:

package main

import (
	"fmt"
	"sync"
)

var (
	// Общий ресурс, доступ к которому нужно синхронизировать
	counter int
	// Mutex для синхронизации доступа к counter
	mu sync.Mutex
)

func main() {
	var wg sync.WaitGroup
	// Запускаем 1000 горутин, каждая из которых увеличивает counter на 1
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			mu.Lock() // Блокируем доступ к counter
			counter++ // Безопасно увеличиваем counter
			mu.Unlock() // Освобождаем доступ
		}()
	}
	wg.Wait() // Ждем завершения всех горутин

	fmt.Println("Значение counter после 1000 увеличений:", counter)
}

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

Другие примеры Mutext

  • Mutex встроенный в структуру:
type MemoryStorage struct {
        counter int
        data      map[int]User
        sync.Mutex
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *