ReaderWriteLockSlim или Lock - PullRequest
       40

ReaderWriteLockSlim или Lock

3 голосов
/ 30 сентября 2011

Я использую 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 ]

5 голосов
/ 30 сентября 2011

Я не уверен, почему вы используете блокировку. Вся идея ConcurrentBag заключается в том, что одновременно .

Если только вы не пытаетесь помешать какой-либо другой цепочке взять вещи или добавить вещи в сумку во время ее опустошения.

Перечитывая ваш вопрос, я почти уверен, что вы вообще не хотите синхронизировать доступ здесь. ConcurrentBag позволяет нескольким потокам Take и Add без необходимости какой-либо явной синхронизации.

Если вы заблокируете сумку, никакие другие потоки не смогут добавлять или удалять объекты во время работы вашего кода. Предполагая, конечно, что вы защищаете любой доступ к сумке с помощью замка. И как только вы это сделаете, вы полностью победили цель создания параллельной структуры данных без блокировки. Ваша структура данных стала неэффективным списком, управляемым блокировкой.

То же самое, если вы используете блокировку чтения-записи. Вам придется синхронизировать каждый доступ.

В этом случае вам не нужно добавлять явную синхронизацию. Угробить замок.

1 голос
/ 01 октября 2011

Блокировка отлично подходит, когда потоки выполняют много операций подряд (пакетный режим - низкий уровень конкуренции)

RWSlim отлично подходит, когда у вас намного больше блокировок чтения, чем блокировок записи (интенсивное чтение - высокая конкуренция при чтении)

Lockless отлично подходит, когда вам нужно, чтобы несколько читателей и / или писателей работали одновременно (смесь чтения / записи - много споров)

...