1 / 1 / 0
Регистрация: 22.05.2015
Сообщений: 12
|
|
1 | |
Параллельное выполнение метода07.10.2018, 02:07. Показов 2646. Ответов 8
Здравствуйте!
Пишу многопоточное приложение, в котором есть основной поток, поток управляющий рабочими потоками и рабочие потоки. Количество рабочих потоков задается из вне. Я создаю массив потоков и когда необходимо каждому элементу массива присваиваю адрес в памяти и передаю в него делегат с методом, в который передаю ряд параметров. Когда создается новый поток и в него также передается делегат все с тем же методом, то в потоке, который еще обрабатывает старые данные значения переменных меняются на вновь передающиеся, т.к. адреса в памяти параметров метода те же. И теперь вопрос: можно ли сделать так, чтобы при создании потока создавалась копия метода с уникальными адресами для хранения переменных? Спасибо за внимание!
0
|
07.10.2018, 02:07 | |
Ответы с готовыми решениями:
8
Периодическое выполнение метода, но не таймер Отменить выполнение метода по таймауту Ожидание выполнение асинхронного метода Как прекратить выполнение асинхронного метода |
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
|
|
07.10.2018, 07:12 | 2 |
Ссылочные типы данных не копируются при передаче в метод или присвоении в другую переменную.
Безотносительно, работаете вы с этими данными из разных потоков или из одного. Если нужно работать с копией данных - делайте копию.
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
07.10.2018, 12:54 | 3 |
Параметры метода при каждом вызове и так уникальны, если не используются модификаторы ref/out/in.
Вы скорее всего в своем делегате захватываете какие-то локальные, вот и работаете с одними и теми же переменными в разных потоках. Покажите код запуска потоков.
0
|
1 / 1 / 0
Регистрация: 22.05.2015
Сообщений: 12
|
|||||||||||
07.10.2018, 14:14 [ТС] | 4 | ||||||||||
Я сглупил и забыл, что целочисленный массив это ссылочный объект, теперь я в теле метода создаю новый массив, но пока я присваиваю ему значения полученные в качестве аргументов, другой поток успевает изменить значения
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
07.10.2018, 14:29 | 5 |
megashchik, клонируйте матрицы до запуска потока.
То же касается и переменной, передаваемой через ref (хоть она нигде и не используется). А в целом, почему у вас одни потоки изменяют матрицы, пока другие их считывают?
1
|
1 / 1 / 0
Регистрация: 22.05.2015
Сообщений: 12
|
||||||
07.10.2018, 16:10 [ТС] | 6 | |||||
Спасибо, в итоге заработало, когда я сделал как Вы сказали:
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
07.10.2018, 16:14 | 7 |
megashchik, я не знаю, что у вас в методе делает переменная intermediate, но учтите, что во всех потока будет вестись работа с одной и той же переменной, потому что вы ее захватываете.
0
|
1 / 1 / 0
Регистрация: 22.05.2015
Сообщений: 12
|
|
07.10.2018, 17:11 [ТС] | 8 |
У меня там блокировка стоит против одновременного доступа к ней и это и должна быть единственная переменная с возможностью доступа, поэтому и передаю ее через ref, но видимо, это бесполезно, раз это и так массив
0
|
1 / 2 / 0
Регистрация: 02.06.2018
Сообщений: 33
|
|
10.10.2018, 12:26 | 9 |
Используйте метод, определенный в классе. Определите новый экземпляр класса, он даст копию метода.
Все это не решит проблемы, общий ресурс у вас – массив. А работа с одним ресурсом из нескольких потоков не-потокобезопасна. Для решения этих вопросов существуют специальные инструменты, например, класс BVM.
0
|
10.10.2018, 12:26 | |
10.10.2018, 12:26 | |
Помогаю со студенческими работами здесь
9
Как остановить выполнение метода Void? Выполнение действий после закрытие метода Main Выполнение метода в отдельном потоке без await/async Как прервать выполнение тестового метода при отсутствии соединения с Интернет Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |