|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||||||
.NET 4.x Отслеживание изменений массива данных из второго потока18.01.2019, 19:37. Показов 5937. Ответов 49
Метки многопоточность (Все метки)
Хочу узнать мнения гуру касаемо подхода в реализации следующего. Есть массив данных и два потока. Один поток производит операции с элементами этого массива (добавление и обновление рандомных элементов). Другой поток должен отслеживать изменения в этом массиве и строго дублировать его. Первый поток должен быть полностью автономным и не зависеть от работы второго. Т.е работа второго никаким образом не должна тормозить работу первого, обратное же допустимо. Т.к. сам массив может быть очень большим(а в теории бесконечным), то проходить циклом во втором потоке весь массив и искать изменения не совсем разумно. Получается первый поток должен сообщить второму о том, какие элементы он изменил (добавил/обновил).
У меня получилось вот это:
После того как Reader прочитал все изменения, выставляем isRead в true. Первый поток увидев, что изменения были считаны перед добавлением в _MultiThread.data затирает все с помощью _clear(). И вроде все работает как надо. Но, так как я в многопоточности новичок, хотел бы знать как можно иначе реализовать алгоритм? Возможно ли использовать lock и обойтись без ManualResetEventSlim ? И есть ли в моей реализации ошибки?
0
|
||||||
| 18.01.2019, 19:37 | |
|
Ответы с готовыми решениями:
49
Отслеживание изменений БД Отслеживание изменений Отслеживание изменений в БД |
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|
| 20.01.2019, 19:42 | |
|
0
|
|
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||||||
| 20.01.2019, 20:24 [ТС] | ||||||
0
|
||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|||||||
| 20.01.2019, 21:24 | |||||||
Вы в первом посте сказали, что массив бесконечный, а значит индексы принимают любые значения. Так же вы сказали, что индексы часто повторяются. Значит для тестов нужно брать набор индексов, принимающих любые значения, но многие из которых повторяются.
0
|
|||||||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
|
| 20.01.2019, 21:34 [ТС] | |
|
0
|
|
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|
| 20.01.2019, 21:43 | |
|
0
|
|
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||
| 20.01.2019, 22:41 [ТС] | ||
|
Проверил алгоритмы, можно сказать, что почти в полевых условиях. Так вот, в них HashSet уступает по скорости везде. Самый быстры вариант это simple bit. Добавлено через 6 минут Не по теме: чет поздно уже, спать пора %-)
0
|
||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|||
| 21.01.2019, 09:59 | |||
|
Добавлено через 36 минут И, как я понял, второй поток будет обнулять биты после чтения. То есть, получится, что 2 потока пишут в 1 массив, а значит уже нужна синхронизация, иначе второй поток может затереть значение записанное первым потоком не прочитав его.
0
|
|||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||||
| 21.01.2019, 18:55 [ТС] | ||||
|
В предыдущем примере, где генерируются числа от 0 до 10240, в реальных условиях эти числа являются индексами элемента массива размером 10240 и неважно какого типа. А об изменении его элементов можно сообщать компактно упаковав в биты представленные массивом byte длиной всего 1280 в котором позиция каждого бита будет соответствовать номеру элемента в основном массиве. Соответсвенно чтобы сообщить об изменении 777-го элемента массива, нужно выставить 777-й бит в 1. В данном способе запись происходит быстрее, чем его чтение. Добавлено через 1 час 18 минут Такой вопрос. К чему может привести побитовая запись/чтение массива byte обоими потоками без использования lock? Сейчас у меня второй поток при считывание бита переключает его в 0.
0
|
||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||
| 21.01.2019, 19:03 | ||
|
Добавлено через 5 минут Сценарий такой. В массиве записано значение X. Первый поток хочет заменить его на Y = f(x). Второй хочет считать и обнулить. 1. Оба потока считывают значение X. 2. Первый поток записывает значение Y. 3. Второй поток записывает значение 0. В итоге значение Y никогда не будет прочитано вторым потоком.
0
|
||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
|||
| 21.01.2019, 19:20 [ТС] | |||
|
И я это представляют так: Есть 3 случая (допустим всего битов 100): 1. Второй поток уже прочитал 50 битов, первый поток в это же время переключил 20 бит с 0 на 1. — В этом случае данные будут прочитаны при следующем проходе массива вторым потоком. 2. Второй поток прочитал только 10 битов, первый поток в это же время переключил 20 бит с 0 на 1. — В этом случае данные будут прочитаны вторым потоком в текущем цикле. 3. Второй поток считывает 88 бит, первый поток в это же время тоже лезет к 88 биту. — В этом случае ??? кто успел тот и переключил?? Добавлено через 2 минуты
0
|
|||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
|||
| 21.01.2019, 20:07 | |||
|
0
|
|||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||
| 21.01.2019, 20:09 [ТС] | ||
|
0
|
||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||||||||||
| 21.01.2019, 20:15 | ||||||||||||
0
|
||||||||||||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||
| 21.01.2019, 20:31 [ТС] | ||
|
0
|
||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||
| 21.01.2019, 20:33 | ||
|
0
|
||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
||
| 21.01.2019, 20:41 [ТС] | ||
|
0
|
||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||
| 21.01.2019, 20:51 | ||
|
Добавлено через 4 минуты Другими словами, проц берет целый байт из массива, записывает его в свой регистр. Там, в регистре, меняет ему один из битов. Потом значение из регистра пишет обратно в память. Добавлено через 1 минуту То, что это записывается в одну строчку, не значит, что оно содержит только одну операцию.
0
|
||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
|||||||||
| 21.01.2019, 21:18 [ТС] | |||||||||
|
Я вижу что по результатам теста hashset уступает по скорости. Пытаюсь найти более быстрый и более оптимальный по производительности/затратам вариант. Есть решение по-лучше? Самый наглядный тест, который все покажет. Рандом с минимумом 100_000 и максимум 1_000_000 (т.е. это если предположить, что исходный массив имеет длину в 1 млн.). HashSet здесь вообще нервно курит. Побитовый сценарий справляется в 4 раза быстрее, с учетом что чтение производится с последующим переключением прочитанного бита в 0.
Добавлено через 10 минут
0
|
|||||||||
|
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
|
||||
| 21.01.2019, 21:24 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
|
|||
| 21.01.2019, 21:36 [ТС] | |||
|
Чего там понимать? В байте 8 бит. 2^8 = 256 в byte же можно запихнуть значение от 0 до 255. Что тут сверхнового? Добавлено через 10 минут Использовать HashSet ради сокращения длины кода жертвуя производительностью?! Я не настолько перфекционист.
0
|
|||
| 21.01.2019, 21:36 | |
|
отслеживание изменений Отслеживание изменений отслеживание изменений Отслеживание изменений Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|