none
C# 6 Использование комбинаций потокобезопасных коллекций RRS feed

  • Вопрос

  • Добрый день!

    Расскажите, как использовать потокобезопасные коллекции, чтобы их комбинации были тоже потокобезопасными?

    Спасибо.

    12 июля 2016 г. 14:03

Ответы

  • Добрый день.

    Судя по всему, вы пытаетесь другим способом получить ответ на вопрос из соседней темы. Как вам написали в той теме, нужно понимать, что именно вы делаете. Например, вы хотите обеспечить многопоточный доступ к двухмерному массиву. Например, никто вам не мешает потратить в два раза больше памяти и сделать аналогичного размера массив object и через lock по соответствующим индексам в этом массиве блокировать поэлементный доступ к массиву с данными. Что-то более конкретное можно сказать по результатам того как у вас идет обработка. Если у вас с одиночными дочерними коллекциями работают только по одному потоку, то вам нужно реалзиовать блокировку создания и удаления дочерних коллекций. Если у вас дочерние коллекции создаются и удаляются в одном потоке, а многопоточно обрабатываются, то это блокировки поэлементного доступа (я вам в соседней теме написал как можно в этом случае поступить). Если у вас и дочерние коллекции и элементы обрабатываются несколькими потоками, то в зависимости от типов обраотки можно использовать или ConcurrentDictionary<int,int[]> или ConcurrentDictionary<int,ConcurrentDictionary<int,int>>.

    • Помечено в качестве ответа Энтомолог 13 июля 2016 г. 16:02
    13 июля 2016 г. 6:52
    Отвечающий
  • Показывайте свой код, как вы используете эти коллекции в комбинации. Невозможно ничего сказать, не видя их использование.

    Потокобезопасная коллекция (класс) гарантирует результат только в себе самой. Но, например, если нужно из одной такой коллекции удалить часть данных и добавить их в другую подобную коллекцию, то между этими двумя операциями может вклиниться другой поток. Результат может быть непредсказуемым. В итоге, возникает необходимость лочить эти две операции вместе.  То есть у нас на одну операцию получаются три блокировки: по одной в каждой коллекции и третья на обе. Что может катастрофически сказаться на производительности.

    Если преобладает именно такой сценарий, то может оказаться выгодней использовать обычные коллекции и вручную расставленные lock'и (или другие примитивы синхронизации).

    • Помечено в качестве ответа Энтомолог 13 июля 2016 г. 16:02
    13 июля 2016 г. 13:46

Все ответы

  • Добрый день.

    Судя по всему, вы пытаетесь другим способом получить ответ на вопрос из соседней темы. Как вам написали в той теме, нужно понимать, что именно вы делаете. Например, вы хотите обеспечить многопоточный доступ к двухмерному массиву. Например, никто вам не мешает потратить в два раза больше памяти и сделать аналогичного размера массив object и через lock по соответствующим индексам в этом массиве блокировать поэлементный доступ к массиву с данными. Что-то более конкретное можно сказать по результатам того как у вас идет обработка. Если у вас с одиночными дочерними коллекциями работают только по одному потоку, то вам нужно реалзиовать блокировку создания и удаления дочерних коллекций. Если у вас дочерние коллекции создаются и удаляются в одном потоке, а многопоточно обрабатываются, то это блокировки поэлементного доступа (я вам в соседней теме написал как можно в этом случае поступить). Если у вас и дочерние коллекции и элементы обрабатываются несколькими потоками, то в зависимости от типов обраотки можно использовать или ConcurrentDictionary<int,int[]> или ConcurrentDictionary<int,ConcurrentDictionary<int,int>>.

    • Помечено в качестве ответа Энтомолог 13 июля 2016 г. 16:02
    13 июля 2016 г. 6:52
    Отвечающий
  • Показывайте свой код, как вы используете эти коллекции в комбинации. Невозможно ничего сказать, не видя их использование.

    Потокобезопасная коллекция (класс) гарантирует результат только в себе самой. Но, например, если нужно из одной такой коллекции удалить часть данных и добавить их в другую подобную коллекцию, то между этими двумя операциями может вклиниться другой поток. Результат может быть непредсказуемым. В итоге, возникает необходимость лочить эти две операции вместе.  То есть у нас на одну операцию получаются три блокировки: по одной в каждой коллекции и третья на обе. Что может катастрофически сказаться на производительности.

    Если преобладает именно такой сценарий, то может оказаться выгодней использовать обычные коллекции и вручную расставленные lock'и (или другие примитивы синхронизации).

    • Помечено в качестве ответа Энтомолог 13 июля 2016 г. 16:02
    13 июля 2016 г. 13:46