|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
||||||
Потокобезопасный List28.07.2016, 14:35. Показов 22828. Ответов 38
Метки нет (Все метки)
Здравствуйте!
Понадобился мне список, которым я могу управлять (доступ + изменение + добавление) из разных потоков. Написал простейшую обертку, но не уверен, что все корректно сделал. Подскажите пожалуйста, что тут не так?
0
|
||||||
| 28.07.2016, 14:35 | |
|
Ответы с готовыми решениями:
38
Потокобезопасный метод Потокобезопасный массив Потокобезопасный код |
| 28.07.2016, 14:42 | |
|
Не по теме: Есть стандартные списки потокобезопасные. Доступ по индексу посчитали не нужным. Может он и Вам на самом деле не нужен?)
0
|
|
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
|
| 28.07.2016, 14:44 [ТС] | |
|
Rius, Да, не нужен, я просто написал в качестве примера. Мне нужен метод Remove(T elem) и поиск элемента, поле которого удовлетворяет условиям (Тут же без доступа по индексу можно?)
А остальное корректно написано? Все с потокобезопастностью хорошо?
0
|
|
|
|
|
| 28.07.2016, 14:52 | |
|
Нормально.
Посмотрите существующие средства https://msdn.microsoft.com/en-... 97305.aspx
1
|
|
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
|
| 28.07.2016, 15:09 | |
|
Kertis138, не смотря на то, что лучшим выходом будет поискать готовое решение (как уже было предложено выше), не следует забыть о такой классной штуке как ReaderWriterLockSlim. Этот механизм синхронизации умеет блокировать потоки только тогда, когда один из них пытается выполнить запись, параллельному чтению данный механизм не препятствует. В этом его огромное преимущество перед lock. В примере в первом посте такая штука могла бы быть более уместна, чем lock.
1
|
|
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
|||||||
| 28.07.2016, 15:18 [ТС] | |||||||
|
Usaga,
Ну получилось что-то вот такое:
Добавлено через 1 минуту
0
|
|||||||
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
|||
| 28.07.2016, 15:23 | |||
|
Кстати, такие вещи как IndexOf очень опасны в многопоточном приложении. Не рекомендую использовать. Между поиском индекса элемента и его запросом (через другой метод, как в примере в первом посте) содержимое списка может сильно поменять другим потоком и полученный ранее индекс может стать неактуальным. Поиск и получение объекта нужно выполнять как одну атомарную процедуру.
1
|
|||
|
9 / 9 / 6
Регистрация: 13.11.2012
Сообщений: 173
|
|
| 28.07.2016, 15:28 | |
|
Kertis138, а очередь не подойдет для Вашей задачи?
1
|
|
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
||
| 28.07.2016, 15:29 [ТС] | ||
|
Там есть метод TryTake и она возвращает bool. Как мне удалить элемент из коллекции и что делать с этим bool ?
0
|
||
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
||||||
| 28.07.2016, 15:33 | ||||||
|
Kertis138, TryTake возвращает полученный объект через аргумент переданный с модификатором OUT. Bool - признак того, получилось ли вытащить из коллекции объект или нет.
Я не знаю, где ты пример смотрел, но вот этот (с MSDN) вполне себе понятен: Кликните здесь для просмотра всего текста
1
|
||||||
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
|
| 28.07.2016, 15:36 [ТС] | |
|
Usaga, Ну вот я попытаюсь удалить элемент, а удаление будет не успешным. Но мне то нужно как-то удалить элемент. С помощью while пытаться удалить, пока не удалит?
0
|
|
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
|
| 28.07.2016, 15:43 | |
|
Kertis138, удаление будет неуспешным только в том случае, если коллекция пуста (в ней нечего удалять - или не положили, или другой поток уже забрал последний элемент).
1
|
|
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
|
| 28.07.2016, 15:44 [ТС] | |
|
0
|
|
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
||
| 28.07.2016, 15:48 | ||
|
1
|
||
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
||||||
| 28.07.2016, 15:57 [ТС] | ||||||
|
Usaga, Ну тогда буду обертку использовать.
Она же у меня корректно написана?
0
|
||||||
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
|
| 28.07.2016, 16:12 | |
Сообщение было отмечено Kertis138 как решение
Решение
Kertis138, не вижу у тебя методов доступа к хранимым объектам, а без этого от такой коллекции мало толку
К тому же в методе Remove не производится проверка на наличие объекта в коллекции - может его только что другой поток удалил?
1
|
|
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
|||||||
| 28.07.2016, 16:36 [ТС] | |||||||
GetEnumerator не требует блокировок?
0
|
|||||||
|
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,234
|
|
| 28.07.2016, 17:14 | |
Сообщение было отмечено Kertis138 как решение
Решение
Kertis138, для ForEach достаточно блокировки на чтение - при ForEach элементы не могут быть удалены. Одновременно использовать EnterWriteLock и EnterReadLock - не нужно. Как я уже писал выше - итератор (Enumerator) не отслеживает состояние родительской коллекции после своего создания и может вернуть (при перечислении) объекты, которых там уже нет, так использовать их стоит с опаской.
Добавлено через 3 минуты Кстати, что First(), что Last() кинет исключение, если коллекция пуста. Используй FirstOrDefault() и LastOrDefault(). Добавлено через 6 минут Про итераторы я прогнал - сказанное относится к потокобезопасной коллекции обсуждавшейся ранее. Не используй итераторы списка вне твоей обертки!
1
|
|
|
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
|
|
| 28.07.2016, 17:30 [ТС] | |
|
Usaga, Спасибо за помощь!
0
|
|
|
8 / 8 / 0
Регистрация: 13.12.2016
Сообщений: 48
|
||||||||||||||||
| 21.02.2017, 10:34 | ||||||||||||||||
|
Приветствую!!!
Очень пригодился ваш код. Добавил в него возможность обращение к элементу по индексу
Приходится заново приводить к нужному типу элемент листа с индексом.
Пытаюсь использовать GetType(), но не знаю в каком месте его использовать
1
|
||||||||||||||||
| 21.02.2017, 10:34 | |
|
Помогаю со студенческими работами здесь
20
Потокобезопасный вызов метода
Linq преобразование List<List<double>> в List<Array> Необходимо создать dll в которой буду обрабатывать list<list<string>> List<string> или все же List<StringBuilder>, что лучше использовать? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|