170 похожих чатов

Коллеги, добрый день! Подскажите, пожалуйста, по Mutex: у меня есть такая структура: type

Service struct {
dao *dao.Dao
mu *sync.Mutex
ctx context.Context
}

У структура есть метод, который вызывается при работе 10+ горутин:
func (s *Service) getMetadataInstant(spec int, hash string) *metadata.Instant {
s.mu.Lock()
defer s.mu.Unlock()
metadataInstant, ok := metadata.RuntimeMetadata[spec]
if !ok {
raw := s.dao.RuntimeVersionRaw(spec)
if raw.Raw == "" {
raw.Raw = s.regCodecMetadata(hash)
}
metadataInstant = metadata.Process(raw) //тут race condition,
// metadata.Process(raw) пишет в глобальную мапу в пакете metadata
}
return metadataInstant
}
Не смотря на то, что я блокирую мютекс, я получил в коде race condition. Такого быть не должно, если мютекс заблокирован, или я неправильно понимаю суть мютекса?

7 ответов

18 просмотров

Возможно у вас в другом месте идет работа с этой же map, либо у вас есть копия этого сервиса

возможно вам лок нужно перенести в место где map меняется

Alexqrid- Автор вопроса
Roman 🎄
Возможно у вас в другом месте идет работа с этой ж...

Спасибо, но в коде 1 сервис только. и он запускает пул горутин с помощью panjf2000/ants/v2, которые работают и в какой-то момент дёргают эту функцию, но копия сервиса одна.

Alexqrid- Автор вопроса
Igor Kuznetsov
возможно вам лок нужно перенести в место где map м...

Это конечно идеальный вариант, но там либа сторонняя, которая постоянно обновляется, можно конечно PR послать, наверное попробую, кстати, спасибо)

> metadata.Process(raw) пишет в глобальную мапу в пакете metadata а оно синхронизировано?

Alexqrid- Автор вопроса
c
> metadata.Process(raw) пишет в глобальную мапу в ...

но я для этого мютекс использую, чтобы именно этот участок,где происходит запись, заблочить

Alexqrid
Это конечно идеальный вариант, но там либа сторонн...

еще вариант что вывоз функции process можно делать не в каждой горутине а только в одной, а остальные е б ей передавали данные через канал

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта