Задать вопрос

Потокобезопасен ли этот код?

Знаю что я уже кучу раз спросил об этом но один фиг не могу вкурить потокобезопасность.

Код:
import (
	"html/template"
	"sync"
)

var rw = &sync.RWMutex{}
var st = map[string]*template.Template{}

func Get(patch string) (*template.Template, bool) {
	rw.RLock()
	defer rw.RUnlock()
	q, w := st[patch]
	return q, w

}

func set(patch string, value *template.Template) {
	rw.Lock()
	defer rw.Unlock()
	st[patch] = value
}

Функция set работает в 1 поток перед запуском веб сервера, функция Get уже "ездит" по кучи рутин. По сути карта хранит скомпилиные html шаблоны.

Ход моих мыслей:
map потокобезопасен
*template.Template не безопасен ведь я работаю с ссылкой (что делать?)
  • Вопрос задан
  • 753 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 2
bitver
@bitver
Когда вы работаете с map, даже удалите указатель, то ничего не случится плохого.

Но если вы измените данные под указателем, то это в разных потоках не безопасно. Для этого нужен ещё один мьютекс (или много на каждый указатель), или в Get методе делать копию и передавать указатель копии.
Ответ написан
@ivahaev
Программист, связист и просто хороший человек
Если шаблоны не меняются после того, как сложены в мапу, то ничего страшного, что их будут много рутин читать. Мапа защищена мутексом, при условии, что шаблон никто не меняет, все нормально будет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы