Вопросы по потокобезопасности коллекций и объектов?

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

2. В пространстве Concurrent имеется список BlockingCollection.Он используется для безопасного добавления и чтения со встроенной блокировкой?

3. Когда требуется чтение свойства объекта из множества потоков ссылочного типа или элементарного, то нужно ли делать блокировки? И нужно ли делать это в случае чтения потоками поля?
  • Вопрос задан
  • 404 просмотра
Решения вопроса 1
w1ld
@w1ld
Программирую
1. Ну, `List` не потокобезопасен. Для избежания Kernel-mode constructs (`lock` и пр.) можно попробовать потокобезопасные ConcurrentQueue или ConcurrentStack в System.Collections.Concurrent, если заполнение до чтения (а не вовремя). Наполняете, вызываете GetEnumerable, который делает снэпшот коллекции, сравниваете. Чтение должно происходить без блокировки.

2. BlockingCollection для проблемы producer-consumer, когда одновременно чтение и запись. Я так понял это не входит в задачу.

3. Если вы не изменяете, то и блокировать не нужно. Вне зависимости от reference или value type. (Конечно, через стэк лучше, если изменяете. Тогда копия для каждого потока своя.)

По теме можно Рихтера почитать, CLR via C#, 10 глава, Asynchronous Synchronization и The Concurrent Collection Classes
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы