ConcurrentBag <MyType> по сравнению со списком <MyType>

Что преимуществом использования является ConcurrentBag (MyType) против просто использования Списка (MyType)? Страница MSDN на CB указывает это

ConcurrentBag (T) является ориентированной на многопотоковое исполнение реализацией сумки, оптимизированной для сценариев, где тот же поток будет и производить и использовать данные, хранившие в сумке

Таким образом, каково преимущество? Я могу понять преимущество других типов набора в пространстве имен Параллелизма, но этот озадачил меня.

21
задан Servy 7 September 2017 в 20:43
поделиться

4 ответа

Внутри ConcurrentBag реализован с использованием нескольких разных списков, по одному для каждого потока записи.

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

Таким образом можно свести к минимуму конфликт блокировок, когда несколько потоков одновременно читают и пишут. Когда у читающего потока нет списка или его список пуст, он должен заблокировать список, назначенный другому потоку. Но если у вас есть несколько потоков, все из которых читают и записывают в свой собственный список, то у вас никогда не будет конкуренции за блокировку.

36
ответ дан 29 November 2019 в 06:34
поделиться

В отличие от других параллельных коллекций, ConcurrentBag оптимизирован для однопоточного использования.
В отличие от List, ConcurrentBag можно использовать из нескольких потоков одновременно.

3
ответ дан 29 November 2019 в 06:34
поделиться

Я думаю, вы должны прочитать это как «когда несколько потоков обращаются к контейнеру, и каждый поток может как производить, так и / или потреблять данные», это определенно предназначено для параллельных сценариев. .

2
ответ дан 29 November 2019 в 06:34
поделиться

Самым большим преимуществом здесь является то, что ConcurrentBag безопасен для доступа из нескольких потоков, а LisT - нет. Если для вашего сценария важен потокобезопасный доступ, то тип вроде ConcurrentBag , возможно, будет вашим преимуществом перед List + ручная блокировка. Нам нужно узнать немного больше о вашем сценарии, прежде чем мы действительно сможем ответить на этот вопрос.

Кроме того, List является упорядоченной коллекцией, а ConcurrentBag - нет.

17
ответ дан 29 November 2019 в 06:34
поделиться