Size: a a a

2020 December 06

MB

Mikail Bagishov in Rust Async
Можно внешний мьютекс заменить на RwLock, можно использовать библиотеки типа dashmap (которая как RwLock<HashMap>, но быстрее)
источник

AK

Aleksandr Kravtsov in Rust Async
antuan
От чего хочешь защититься, вешая мьютекс на мапу? Мб rwlock хочется в действительности? С ним такой проблемы быть не должно по идее.
защититься хочу от ситуации когда два потока прочитают что в карте по ключу ничего нет и оба туда положат мутексы но положится только один
источник

a

antuan in Rust Async
Aleksandr Kravtsov
защититься хочу от ситуации когда два потока прочитают что в карте по ключу ничего нет и оба туда положат мутексы но положится только один
Rwlock.
источник

AK

Aleksandr Kravtsov in Rust Async
источник

a

antuan in Rust Async
antuan
Rwlock.
Ток после того, как получишь write-lock, проверь ещё раз, что по ключу все еще пусто
источник

AK

Aleksandr Kravtsov in Rust Async
как то так вышло :) валидно?
источник

MB

Mikail Bagishov in Rust Async
Разыменования лишние
источник

MB

Mikail Bagishov in Rust Async
А еще можно downgrade делать вместо read()
источник

a

antuan in Rust Async
Aleksandr Kravtsov
как то так вышло :) валидно?
А я бы взял read, попытался найти элемент, если его нет - write (предварительно прибив читателя), потом ещё одну проверку на отсутствие элемента, а потом вставка. Локов на чтение может быть сколько угодно, а вот лок на запись лочит и запись, и чтение (и ждёт, пока читатели не сдохнут).
Так что брать write прям сразу может быть не очень оптимально по производительности.
источник

AK

Aleksandr Kravtsov in Rust Async
ага, понял, если элемент уже будет то блокировку на запись совсем можно не делать
источник

AK

Aleksandr Kravtsov in Rust Async
Mikail Bagishov
Разыменования лишние
аа, точно, там же дереф 👍
источник
2020 December 07

AK

Aleksandr Kravtsov in Rust Async
@MikailBag @antonio_antuan ребят гляньте плиз, это всё про вчерашнее, переписал чтобы сначала брать блокировку на чтение, так пойдёт?
источник

a

antuan in Rust Async
Aleksandr Kravtsov
@MikailBag @antonio_antuan ребят гляньте плиз, это всё про вчерашнее, переписал чтобы сначала брать блокировку на чтение, так пойдёт?
Хм, а оно щас работает?
источник

AK

Aleksandr Kravtsov in Rust Async
да, а не должно?
источник

a

antuan in Rust Async
Aleksandr Kravtsov
да, а не должно?
Мне казалось,.что нет)
Write жив и там же берется read
источник

AK

Aleksandr Kravtsov in Rust Async
почему? сначала берётся рид, если в мапе ничего нет то идём в елс, дропаем рид и берём write
источник

a

antuan in Rust Async
Aleksandr Kravtsov
почему? сначала берётся рид, если в мапе ничего нет то идём в елс, дропаем рид и берём write
А mtx.lock() в конце?
источник

AK

Aleksandr Kravtsov in Rust Async
он дропнется там где закрывающая фигурная скобка
источник

a

antuan in Rust Async
Aleksandr Kravtsov
он дропнется там где закрывающая фигурная скобка
Ага. Но write к моменту lock`а еще не дропнут
источник

AK

Aleksandr Kravtsov in Rust Async
а, понял, ты про то то чтобы взять write-lock, вставить мутекс если его нет, затем снова взять рид-лок, вытащить мутекс и на нём залочится, чтобы не блокировать всю мапу пока делаются штуки
источник