Sobes.tech
Middle+
157
questionbank

Как объединить по смыслу карты (map) и мьютексы (mutex)?

Ответ от нейросети

sobes.tech AI

Для создания конкурентно-безопасной карты.

При одновременном доступе нескольких горутин к map могут возникнуть гонки данных. Мьютекс, или RWMutex для более тонкого контроля, используется для синхронизации доступа. Перед чтением или записью данных в карту накладывается блокировка, а после операции она снимается.

Пример с sync.RWMutex:

package main

import (
	"sync"
)

// SafeMap - конкурентно-безопасная карта
type SafeMap struct {
	mu sync.RWMutex // мьютекс для защиты карты
	m  map[string]string // сама карта
}

// NewSafeMap - создает новый экземпляр SafeMap
func NewSafeMap() *SafeMap {
	return &SafeMap{
		m: make(map[string]string),
	}
}

// Set - записывает значение в карту с блокировкой на запись
func (sm *SafeMap) Set(key, value string) {
	sm.mu.Lock() // блокировка на запись
	defer sm.mu.Unlock() // снятие блокировки после завершения функции
	sm.m[key] = value
}

// Get - читает значение из карты с блокировкой на чтение
func (sm *SafeMap) Get(key string) (string, bool) {
	sm.mu.RLock() // блокировка на чтение (позволяет множественным горутинам читать одновременно)
	defer sm.mu.RUnlock() // снятие блокировки
	val, ok := sm.m[key]
	return val, ok
}

// Delete - удаляет элемент из карты с блокировкой на запись
func (sm *SafeMap) Delete(key string) {
	sm.mu.Lock() // блокировка на запись
	defer sm.mu.Unlock() // снятие блокировки
	delete(sm.m, key)
}

Таким образом, мьютекс оборачивает доступ к карте, гарантируя, что в любой момент времени только одна горутина может изменять карту (с использованием Lock/Unlock) или множество горутин могут одновременно читать ее (с использованием RLock/RUnlock для RWMutex).