Я и мой ёбаный кот на фоне ковра. Войти !bnw Сегодня Клубы

/s/, я похоже совсем тупой. Мне нужна такая вещь, как "map of mutexes"/"named mutex".
т.е. некая поебень, на которой я могу делать shit.Lock("key") и shit.Unlock("key")
И я не могу придумать какими примитивами это организовать. Язык непитон.
В расспоряжении есть хэши/мапы, есть мьютексы, есть RW-мьютексы, есть тупо нотификаторы.

#80ITCC / @stiletto / 3955 дней назад

ээ, map[string]sync.Mutex
#80ITCC/976 / @lexszero / 3955 дней назад
@lexszero Покажи как ты этим будешь пользоваться
#80ITCC/KGK / @stiletto --> #80ITCC/976 / 3955 дней назад
@lexszero зачем стринг, если есть хеш?
#80ITCC/Y1K / @muromec --> #80ITCC/976 / 3955 дней назад
@stiletto shit["key"].Lock()
#80ITCC/K7R / @lexszero --> #80ITCC/KGK / 3955 дней назад
@lexszero А создание мьютексов в словаре у тебя каким местом происходить будет?
#80ITCC/P73 / @stiletto --> #80ITCC/K7R / 3955 дней назад
@stiletto вообще, если я правильно угадал твой непитон, то часто когда xочетя нетривиальной xуйни с мутексами, то бывает полезно включить голову и отредизайнить на чянаx, создание: гм, не подумал. ну, врапперы, которые будут создавать мутекс если в мэпе для ключа ничего нету
#80ITCC/HBQ / @lexszero --> #80ITCC/KGK / 3955 дней назад
@lexszero И удалять. Покажи этот враппер, лол.
#80ITCC/15K / @stiletto --> #80ITCC/HBQ / 3955 дней назад
Сделай защищенную мьютексом мапу. Lock() берет мьютекс, проверяет ключ, если его нет, добавляет и освобождает мьютекс. Если ключ уже существует, уходим в busywait (мьютекс освобождать не забудь; здесь, кстати, лучше подойдёт rw, чтобы те, кто в busywait, не мешали писателям). Unlock(), думаю, очевиден. Если не нравятся бузивейты, храни по ключу список тех, кто ждёт лока, и уведомляй первого в очереди, когда вызываешь Unlock() (не знаю, что за нотификаторы, но судя по названию, они тебе подойдут). Но это же костыли какие-то. Что за непитон, может, и правда передизайнить поудачнее?
#80ITCC/WAM / @minoru / 3955 дней назад
@stiletto щас до эвм с нормальной клавой доберусь, 5мин
#80ITCC/R41 / @lexszero --> #80ITCC/15K / 3955 дней назад
@minoru Я хочу ответ хотя бы псевдокодом, а не "ну это берешь и ебашишь" :/
#80ITCC/C8B / @stiletto --> #80ITCC/WAM / 3955 дней назад
Бля, ошибок напостил. Сейчас исправленную запощу
#80ITCC/YUU / @stiletto / 3955 дней назад
@stiletto не удаляй плиз
#80ITCC/428 / @238328 --> #80ITCC/YUU / 3955 дней назад
type MutexMap struct { lock sync.RWMutex lock2 sync.Mutex mutexes map[string]sync.Mutex } func (mm *MutexMap) Lock(name string) { mm.lock.Lock() lock, ok := mm.mutexes[name] if !ok { lock = sync.Mutex{} mm.mutexes[name] = lock } mm.lock2.Lock() mm.lock.Unlock() mm.lock.RLock() mm.lock2.Unlock() lock.Lock() mm.lock.RUnlock() } func (mm *MutexMap) Unlock(name string) { mm.lock.Lock() mm.lock2.Lock() lock, ok := mm.mutexes[name] if ok { lock.Unlock() } delete(mm.mutexes, name) mm.lock2.Unlock() mm.lock.Unlock() }
#80ITCC/BQV / @stiletto / 3955 дней назад
@stiletto тупая наивная реализация. нахуя удалять, я не понял. type MutexMap map[string]*sync.Mutex func (m *MutexMap) maybeCreate(key string) { if _, ok := m[key]; !ok { m[key] = new(sync.Mutex) } } func (m *MutexMap) Lock(key string) { m.maybeCreate(key) m[key].Lock() } func (m *MutexMap) Unlock(key string) { m.maybeCreate(key) m[key].Unlock() }
#80ITCC/T7A / @lexszero --> #80ITCC/BQV / 3955 дней назад
Если у тебя возникла необходимость в таком чудовище весьма вероятно что надо переосмыслить архитектуру чтобы потребность исчезла. Лочь весь мап и не пердолься с мьютексами в 2014, или всё повиснет дедлоком из-за тривиальной ошибки.
#80ITCC/UZF / @mugiseyebrows / 3955 дней назад
@lexszero Удалять затем, что в моем юзкейсе разных значений ключа может быть примерно 2²⁵⁶. Не одновременно
#80ITCC/OY7 / @stiletto --> #80ITCC/T7A / 3955 дней назад
@stiletto ну, воткни удоление. тогда анлок будет примерно такой: if _, ok := m[key]; ok { m[key].Unlock() delete(m, key) } что за хуету с двумя мутексами ты нагородил я не распарсил. операции с мэпами в го и так атомарные.
#80ITCC/9HX / @lexszero --> #80ITCC/OY7 / 3955 дней назад
@lexszero А теперь представь, что лок и анлок перемешались. Сначала в локе вызывается maybeCreate, он достает из мапа мьютекс. Затем анлок делает Unlock на этом мьютексе и удаляет его из массива. лок лочит мьютекс, который из массива уже удален.
#80ITCC/3DS / @stiletto --> #80ITCC/9HX / 3955 дней назад
@stiletto *ассоциативного массива
#80ITCC/CKO / @stiletto --> #80ITCC/3DS / 3955 дней назад
@stiletto окей, запихнуть в рвлок. но по-моему ты хуйню какую-то творишь.
#80ITCC/HFJ / @lexszero --> #80ITCC/3DS / 3955 дней назад
@lexszero Ну ты запихни в рвлок и покажи код
#80ITCC/N7N / @stiletto --> #80ITCC/HFJ / 3955 дней назад
@stiletto да, с рвлоком отсос. с обычным локом вроде нормик, но медленее. type MutexMap struct { m map[string]*sync.Mutex sync.Lock } func (m *MutexMap) Lock(key string) { m.m.Lock() defer m.Unlock() if _, ok := m.m[key]; !ok { m.m[key] = new(sync.Mutex) } m.m[key].Lock() } func (m *MutexMap) Unlock(key string) { m.Lock() defer m.Unlock() if mm, ok := m.m[key]; ok { mm.Unlock() delete(m.m, key) } }
#80ITCC/4FM / @lexszero --> #80ITCC/N7N / 3955 дней назад
@polecat этому мудаку Пайк дал чаны, а он мутексы жрет.
#80ITCC/MUA / @lexszero --> #80ITCC/YYL / 3955 дней назад
@lexszero Lock делает m.Lock(), затем вешается на m.m[key].Lock() и стоит ждёт. Unlock делает m.Lock() и виснет.
#80ITCC/W74 / @stiletto --> #80ITCC/4FM / 3955 дней назад
@lexszero У меня есть некое приложение, принимающее запросы по HTTP-API, а затем передающее их некоей другой штуковине. У запросов есть ключ. Я должен сделать, чтобы "другая штуковина" не получала нескольких запросов с одним и тем же ключом одновременно. Только когда закончится один запрос с таким ключом можно обрабатывать второй. Реализуй на каналах, ага.
#80ITCC/X01 / @stiletto --> #80ITCC/MUA / 3955 дней назад
@stiletto А, и да, запросы идут параллельно и имеют объем достаточный, чтобы их не хотелось буферизовать в памяти
#80ITCC/QM6 / @stiletto --> #80ITCC/X01 / 3955 дней назад
@polecat Вешать чтение тела запроса до тех пор пока предыдущий запрос лок не отпустит
#80ITCC/2WC / @stiletto --> #80ITCC/4GG / 3955 дней назад
@polecat > лок(ключ) А я тут што по-твоему реализую
#80ITCC/WSR / @stiletto --> #80ITCC/P0L / 3955 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.