powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / заполнение массива несколькими потоками
12 сообщений из 12, страница 1 из 1
заполнение массива несколькими потоками
    #40026555
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеется двумерный массив и десятки\сотни потоков его заполняют так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim locali As Long
SyncLock MessagesLock
locali = globali'globali - глобальная переменная
Interlocked.Increment(globali)
End SyncLock
mass(locali, 0) = "0"
mass(locali, 1) ="1"
mass(locali, 2) ="2"

это очень медленно. как бы этот массив заполнять сразу строками, не вычисляя номер строки? как list, но чтоб массив и безопасно для всех потоков
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026567
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
массив заполнять сразу строками
сделай массив массивов, в чем проблема?
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026568
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем синхронизировать Interlocked ?
Достаточно так
Код: c#
1.
2.
3.
4.
locali = Interlocked.Increment(globali)
mass(locali, 0) = "0"
mass(locali, 1) ="1"
mass(locali, 2) ="2"



Если надо очень быстро, то каждый поток пишет свой массив и в конце все массивы сливать в один.

PS Это работает если код именно такой как ты написал
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026576
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

объединять массивы разве не дольше, чем сразу писать нормально в массив? Dima TДостаточно такда, действительно
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026580
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
qlewerok
массив заполнять сразу строками
сделай массив массивов, в чем проблема?

+1
Сначала поток заполняет свой массив и добавляет его ConcurrentQueue<T>
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026582
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
объединять массивы разве не дольше, чем сразу писать нормально в массив?

Надо проверять. Если ты с разных потоков одновременно пишешь в один массив - скорость записи падает раз в 10+ из-за синхронизации кэшей ядер проца.
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026590
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не углубляться в технические особенности, то потолок распараллеливания ограничивает Закон Амдала . Там формулы простые, из них понятно что чем меньше синхронизации потоков тем лучше распараллеливается решение задачи. Поэтому обычно быстрее получается когда каждый поток посчитал свое, а в конце все отдали результат потоку, который склеивает все результаты в общую кучу.
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026592
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

если я создаю массив подмассивов и из разных потоков записываю в разные подмассивы, то всё нормально там с ядрами проца? на выходе хорошо бы нормальный обычный массив иметь, т.к. его потом ещё сложно обрабатывать надо весь. в крайнем случае list. или в нём такие же проблемы?
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026598
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
Dima T,

если я создаю массив подмассивов и из разных потоков записываю в разные подмассивы, то всё нормально там с ядрами проца?

Не все нормально, но лучше чем было. Будет примерно так (VB не знаю, пишу схематично)
Код: c#
1.
2.
3.
4.
5.
local_mass(0) = "0"
local_mass(1) ="1"
local_mass(2) ="2"
locali = Interlocked.Increment(globali)
mass(locali) = local_mass


Количество записей в общую память снижается, следовательно снижается количество перебросов между кэшами ядер. Насколько быстрее станет - надо тестить.
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40026609
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tmass(locali) = local_massнеотслеживаемая ошибка, когда прописываю эту строчку. объявляю глобально
Код: vbnet
1.
Dim mass As String()()

локально
Код: vbnet
1.
Dim local_mass(8) As String
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40027732
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Можно попробовать ConcurrentDictionary.
...
Рейтинг: 0 / 0
заполнение массива несколькими потоками
    #40028166
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok,

почему вы используете именно масив?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / заполнение массива несколькими потоками
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]