Оптимизирован ли ConcurrentBag (T) для однопоточных сценариев?Если так, то почему одновременно? - PullRequest
4 голосов
/ 31 января 2011

Документация MSDN по классу ConcurrentBag<T> из библиотеки одновременных коллекций .NET 4.0 гласит:

ConcurrentBag - это поточно-ориентированная реализация пакетов, оптимизировано для сценариев, в которых одна и та же нить будет производить и потреблять данные, хранящиеся в сумке .[выделено мной]

Я что-то упустил или это говорит о том, что класс ConcurrentBag<T> оптимизирован для однопоточных сценариев?я не чего-то не хватает ... с чего бы это?Просто кажется довольно странным иметь коллекцию , предназначенную для параллелизма, но оптимизированную для одного потока.

Ответы [ 3 ]

1 голос
/ 31 января 2011

Оптимизация означает, что, если у вас есть несколько потоков, как производящих, так и потребляющих, то есть оптимизация на месте, так что она быстрее, если она может вернуть предмет, который был помещен в сумку той же нитью.Эта оптимизация неприменима, если нить запрашивает сумку для предмета, и в сумке больше не осталось предметов, которые были помещены туда этой нитью.В этом случае он по-прежнему может извлекать элемент из сумки (помещенный туда другим потоком), но он менее оптимален.


Или, другими словами: это одновременно, так как несколько потоков могутпроизводить в него и потреблять из него одновременно, без внешней блокировки.Упомянутая оптимизация не делает это ложным.

1 голос
/ 31 января 2011

Три сценария, в которых вы можете использовать ConcurrentBag и как эта оптимизация влияет на них:

1) Разделение потоков производителей и потребителей.Без эффекта.

2) Потоки, которые являются потребителями и производителями, хранящими и извлекающими данные из ConcurrentBag.Оптимизация улучшит производительность для операций добавления / извлечения того же потока.

3) Однопоточные сценарии, которые могут использовать регулярную коллекцию.Оптимизация означает, что использование ConcurrentBag не требует больших затрат, поэтому вы можете использовать его без значительного снижения производительности.

1 голос
/ 31 января 2011

Документация пытается сказать, что она предпочитает один и тот же поток, производящий и потребляющий данные.

Он имеет быстрый путь, при котором, когда один и тот же поток создает и потребляет данные, данные остаются в этом потоке (представьте себе [ThreadStatic]). Однако, когда нет данных для использования в том же потоке, он просматривает другие потоки и получает данные оттуда.

Смотри, например, на http://www.codethinked.com/post/2010/01/27/NET-40-and-System_Collections_Concurrent_ConcurrentBag.aspx для более подробного объяснения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...