|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
В МСДН про ConcurrentDictionary пишут, что он не защищён от добавления в него новых элементов, если по нему проходиться итераторами - т. е. весь LINQ идёт нафиг. Да ещё на егошние собственные, словаря, методы наложены куча ограничений - как там пишут, этот метод не итерирует по "слепку" текущего состояния словаря. А в чём смысла тогда смысла этих "защищённых" от многопотока коллекций? Мне-то надо, чтобы именно сколько угодно потоков добавляли данные в словарь там или в аналог List (вроде, это СoncurrentBag?), а другие потоки могли делать всякие Select, SelectMany и прочие линк-ништяки по этим коллекциям. А так получается, что надо самому фиксировать текущий Length коллекции и итерировать обычным for "вручную", по индексам. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 06:37 |
|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
Ну и второй вопрос, что делать, если мне надо как я сказал: авторсколько угодно потоков добавляли данные в словарь там или в аналог List (вроде, это СoncurrentBag?), а другие потоки могли делать всякие Select, SelectMany и прочие линк-ништяки по этим коллекциям. Или только вручную - фором по индексам? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 06:38 |
|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
Webtester88Ну и второй вопрос, что делать, если мне надо как я сказал: авторсколько угодно потоков добавляли данные в словарь там или в аналог List (вроде, это СoncurrentBag?), а другие потоки могли делать всякие Select, SelectMany и прочие линк-ништяки по этим коллекциям. Или только вручную - фором по индексам? Я имею ввиду, когда элементы только добавляются и только в конец - т. е. без сортировок. Когда удаляются или при каждом добавлении происходит пересортировка коллекции - это более сложный случай и мне пока это не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 06:40 |
|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
А может, это какой-то бэд прэктис и этого надо избегать? Но я же ХОЧУ! h ttps://www.youtube.com/watch?v=oR3PepX_ZOc&feature=youtu.be&t=56m45s ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 06:50 |
|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
Webtester88 А в чём смысла тогда смысла этих "защищённых" от многопотока коллекций? В том, что можно использовать несколькими потоками одновременно, не беспокоясь о блокировках и том, что будет нарушено внутреннее состояние объекта. И в том, что затраты на блокировки будут гораздо меньше, чем они были бы у абсолютного большинства коленочных реализаций. P. S. сказано же, если обращаешься через реализуемые интерфейсы, в том числе методы расширения, то потокобезопасность не гарантирована. Нужен мгновенный слепок, используй ICollection.CopyTo, он намертво все лочит, когда создает копию. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 11:24 |
|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
Мда, сложная штука. Думаешь, что разобрался в многопоточности и этих блокировках, но каждый раз всплывают нюансы. Получается, что смысла в многопотоке нет, если эти потоки активно юзают какой-то объект - приложение фактически работает как однопоточное, т. к. все потоки постоянно тормозятся и ждут друг друга. И делание мгновенных слепоков - это всё равно надо всем доступ обрубить, пока делаешь слепок. Т. е. смысла потом в этом слепке нет - проще заблокировать через lock, сделать нужные преобразования с объектом и потом разблокировать - без всякого слепка. Если преобразования занимают по времени меньше, чем создание копии, то смысла в слепках нет - проще блокировки применять. Я правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 19:58 |
|
Чего-то я не понял с многопоточностью и cuncurrent-коллекциями
|
|||
---|---|---|---|
#18+
Webtester88Если преобразования занимают по времени меньше, чем создание копии, то смысла в слепках нет - проще блокировки применять. Я правильно понимаю? Я имею ввиду, кроме случая, когда нужна именно копия объекта. Т. е. мне нужна не копия, а нужно обновить состояние объекта или считать состояние объекта. Если эти операции занимают времени сравнимо с созданием копии или даже меньше - проще обойтись блокировками. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2015, 20:02 |
|
|
start [/forum/topic.php?fid=20&tid=1401219]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 146ms |
0 / 0 |