Re[3]: "Этюд"
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.10.23 02:25
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Здравствуйте, m2user, Вы писали:


M>>HashTable не является thread safe, что проявит себя тем или иным образом (для Dictionary обычно exception) при конкурентном вызове метода Process в разных потоках.


_>В коде у ТС запись в hashtable защищена локом, а hashtable, в отличии от Dictionary, гарантирует N одновременных читателей при 1-м писателе, так что тут всё норм.


Все ли действительно норм — зависит не от того, помечен ли класс относительно потокобезопасным, а от того, совпадает ли ожидание пользователя кэша от того, как ведет себя коллекция.

А вести она себя будет так, что конкурирующие читатель и писатель не сломаются. Но что именно прочитает читатель, проскочив одновременно с писателем — точно не ясно. Либо старое значение, либо новое. Что из этого является норм, или сама неопределенность считается норм — вот тут уже надо спрашивать разработчика этого конкретного кэша. Судя, по тому, что написано в коде, ожидается, что читатели могут довольствоваться старыми значениями уже в тот момент, когда из базы прилетело новое и даже в тот момент, когда в хэштаблицу его уже "начали класть". Осью, вокруг которой крутится логика, является запись в volatile поле version. Но даже после его изменения читатель может все еще достать старое значение.
Re[4]: "Этюд"
От: pilgrim_ Россия  
Дата: 12.10.23 02:33
Оценка: +1
Здравствуйте, samius, Вы писали:

_>>В коде у ТС запись в hashtable защищена локом, а hashtable, в отличии от Dictionary, гарантирует N одновременных читателей при 1-м писателе, так что тут всё норм.


S>Все ли действительно норм — зависит не от того, помечен ли класс относительно потокобезопасным, а от того, совпадает ли ожидание пользователя кэша от того, как ведет себя коллекция.


"норм" относится к техническим деталям поведения hashtable.

S>А вести она себя будет так, что конкурирующие читатель и писатель не сломаются. Но что именно прочитает читатель, проскочив одновременно с писателем — точно не ясно. Либо старое значение, либо новое. Что из этого является норм, или сама неопределенность считается норм — вот тут уже надо спрашивать разработчика этого конкретного кэша. Судя, по тому, что написано в коде, ожидается, что читатели могут довольствоваться старыми значениями уже в тот момент, когда из базы прилетело новое и даже в тот момент, когда в хэштаблицу его уже "начали класть". Осью, вокруг которой крутится логика, является запись в volatile поле version. Но даже после его изменения читатель может все еще достать старое значение.


Всё верно, тот кто юзает hashtable во многопотоке должен понимать и принимать решение, как её возможности с пользой заюзать. К вопросу ТС это не относится, там что-то странное.
Re[2]: "Этюд"
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 12.10.23 08:08
Оценка:
сверху вниз — Таймер службы, потом Parallel.ForEach — то есть перекрывающие вызовы более чем возможны, если предидущий в середине своего Parallel.ForEach а новый уже перезапросил — Bob's your uncle.
Re[2]: "Этюд"
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 12.10.23 08:10
Оценка:
кеш — рудимент, жив так как неикто не хочет выкорчевывать из него репозиторий, так бывает
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.