ReaderWriteLockSlim или Lock
Я использую ConcurrentBag для хранения объекта во время выполнения. В какой-то момент мне нужно опорожнить сумку и сохранить содержимое сумки в списке. Вот что я делаю:
IList<T> list = new List<T>();
lock (bag)
{
T pixel;
while (bag.TryTake(out pixel))
{
list.Add(pixel);
}
}
Мой вопрос связан с синхронизацией. Насколько я прочитал в книге, блокировка быстрее, чем у других методов синхронизации. Источник - http://www.albahari.com/threading/part2.aspx.
Производительность - моя вторая проблема, я хотел бы знать, могу ли я использовать ReaderWriterLockSlim на данном этапе. Какая польза от использования ReaderWriterLockSlim? Причина в том, что я не хочу, чтобы эта операция блокировала входящие запросы.
Если да, я должен использовать Upgradeable Lock?
Есть идеи? Комментарии?
2 ответа
Я не уверен, почему вы используете замок. Вся идея позади ConcurrentBag
в том, что это одновременно.
Если только вы не пытаетесь помешать какой-то другой ветке взять вещи или добавить вещи в сумку, пока вы ее опустошаете.
Перечитывая ваш вопрос, я уверен, что вы вообще не хотите синхронизировать доступ. ConcurrentBag
позволяет нескольким потокам Take
а также Add
, без необходимости делать какую-либо явную синхронизацию.
Если вы заблокируете сумку, то никакой другой поток не сможет добавлять или удалять вещи во время работы вашего кода. Предполагая, конечно, что вы защищаете каждый второй доступ к сумке с помощью замка. И как только вы это сделаете, вы полностью победили цель создания параллельной структуры данных без блокировки. Ваша структура данных стала плохо работающим списком, который контролируется блокировкой.
То же самое, если вы используете блокировку чтения-записи. Вы должны синхронизировать каждый доступ.
Вам не нужно добавлять явную синхронизацию в этом случае. Угробить замок.
Блокировка хороша, когда потоки выполняют много операций подряд (пакетный режим - низкий уровень конкуренции)
RWSlim хорош, когда у вас намного больше блокировок чтения, чем блокировок записи (тяжелое чтение - высокая конкуренция за чтение)
Lockless отлично подходит, когда вам нужно, чтобы несколько читателей и / или писателей работали одновременно (сочетание чтения и записи - много споров)