Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
31 / 21 / 10
Регистрация: 08.10.2017
Сообщений: 181

Программа с управляющим потоком и потоками-подчинёнными

04.06.2019, 20:44. Показов 1189. Ответов 11

Студворк — интернет-сервис помощи студентам
Было необходимо распараллелить вычисления в написанной ранее программе, пришёл к такой схему: есть главный поток; он может порождать новые потоки, которые будут ответственны за вычисления, с некоторыми параметрами при их запуске, сможет просматривать состояние всех потоков, принимать возвращаемые вычислительными потоками значения, сможет также избавляться от уже отработавших потоков, освобождая место под новые. Каждому из вычислительных потоков нужно будет одновременно обращаться к одному и тому же массиву для чтения из него. Я в параллельном программировании совсем новичок, потому не знаю, куда смотреть: в сторону mutex, semaphore или threading (ну или еще куда-то, куда я не знаю). И соответственно, где можно почитать про такого рода управление потоками через главный "надзирающий" поток?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2019, 20:44
Ответы с готовыми решениями:

Как сделать чтобы поток вызванный дочерним потоком не перебивался другими потоками?
При вызове несколько раз подряд возможен перебив другими потоками.Как бы устранить?Я вот думаю что нужно повысить приоритет этого потока до...

С потоком программа работает как и без него
Всем привет! Сделал программу, и решил добавить потоки, но так как не очень давно работаю с C# то не знал как, в инете нашел вот такой...

Полевой транзистор с управляющим PN-переходом JFET
Здравствуйте! Я писала работу по аналоговым ключам. Конкретно о диодном токовом ключе. Там говорилось о том, что, если схема критична к...

11
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
08.06.2019, 15:20
TPL в помощь.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
08.06.2019, 21:05
http://www.albahari.com/threading/
читаем, еще раз читаем, примеры пишем, что непонятно - спрашиваем.
2
31 / 21 / 10
Регистрация: 08.10.2017
Сообщений: 181
17.06.2019, 11:12  [ТС]
Начал этим заниматься, появился вопрос: есть матрица n x n. Создаю n потоков для того, чтобы писать в матрицу по столбцам, т.е. они друг с другом не контактируют и конфликтуют. Однако, матрица оказывается заполненной не полностью - то 2 потока её заполняют, а остальные даже не трогают, то 3, то 4... Полностью она никогда не заполняется, и причины для этого я не вижу. В чём может быть причина?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
17.06.2019, 11:50
Цитата Сообщение от Slepoyi Посмотреть сообщение
Начал этим заниматься, появился вопрос: есть матрица n x n. Создаю n потоков для того, чтобы писать в матрицу по столбцам, т.е. они друг с другом не контактируют и конфликтуют. Однако, матрица оказывается заполненной не полностью - то 2 потока её заполняют, а остальные даже не трогают, то 3, то 4... Полностью она никогда не заполняется, и причины для этого я не вижу. В чём может быть причина?
Зависит от реализации. Покажите код, тогда можно будет что-то сказать.
0
31 / 21 / 10
Регистрация: 08.10.2017
Сообщений: 181
17.06.2019, 19:25  [ТС]
C#
1
2
3
4
5
6
 
            for (int i = 0; i < n; i++)
            {
                int tmp = i;
                new Thread(() => Else_Fill(tmp)).Start();
            }
Cтранно, но эта конструкция не работала как надо на ноутбуке, а на домашнем пк заработала. Наверное, ложная тревога.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
17.06.2019, 19:58
Цитата Сообщение от Slepoyi Посмотреть сообщение
Cтранно, но эта конструкция не работала как надо на ноутбуке, а на домашнем пк заработала. Наверное, ложная тревога.
В вызывающем потоке нет ожидания завершения выполнения создаваемых потоков поэтому не будет работать.
К тому же создавать потоки подобным образом без ограничения их количества это очень неэффективно.
Для этой задачи лучше использовать метод Parallel.For. Там есть и ожидание выполнения всех потоков и ограничение их количества согласно количеству потоков процессора.
0
31 / 21 / 10
Регистрация: 08.10.2017
Сообщений: 181
17.06.2019, 20:27  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
В вызывающем потоке нет ожидания завершения выполнения создаваемых потоков поэтому не будет работать.
К тому же создавать потоки подобным образом без ограничения их количества это очень неэффективно.
Для этой задачи лучше использовать метод Parallel.For. Там есть и ожидание выполнения всех потоков и ограничение их количества согласно количеству потоков процессора.
А разве класс Threading не отдаёт работу с потоками на откуп ОС? В том смысле, что сначала будет запущено максимум потоков, а потом, по мере освобождения потоков, будут дозапускаться новые. Все равно ведь больше, чем можно, не запустим.
И чем плохо то, что вызывающий поток не будет дожидаться завершения выполнения своих детищ?
И тогда вопрос до кучи. Как лучше всего убивать поток? Читал про thread.Interrupt() и thread.Abort(), и одни говорят, что надо использовать первый способ, вторые говорят, что второй. Как тогда?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
17.06.2019, 22:16
Цитата Сообщение от Slepoyi Посмотреть сообщение
В том смысле, что сначала будет запущено максимум потоков, а потом, по мере освобождения потоков, будут дозапускаться новые. Все равно ведь больше, чем можно, не запустим.
Больше чем можно запустим, но работать они будут по очереди.
При этом для запуска требуется выполнить 1000+ процессорных инструкций и выделить 1MB памяти под стэк потока, которая будет занята пока поток не завершится.
Цитата Сообщение от Slepoyi Посмотреть сообщение
И чем плохо то, что вызывающий поток не будет дожидаться завершения выполнения своих детищ?
Ничем не плохо, если в главном потоке не нужно использовать результаты вычислений.
Цитата Сообщение от Slepoyi Посмотреть сообщение
И тогда вопрос до кучи. Как лучше всего убивать поток? Читал про thread.Interrupt() и thread.Abort(), и одни говорят, что надо использовать первый способ, вторые говорят, что второй. Как тогда?
Зависит от того чем занимается поток. А вообще лучше не использовать ни то ни другое. https://jonskeet.uk/csharp/threads/abort.html
0
31 / 21 / 10
Регистрация: 08.10.2017
Сообщений: 181
18.06.2019, 13:28  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Зависит от того чем занимается поток. А вообще лучше не использовать ни то ни другое.
Ну вот поток отработал, запустил из себя другой поток и должен освободить место. Как лучше его остановить?

И есть какой-то эффективный способ распараллеливания рекурсивных алгоритмов методами С#?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
18.06.2019, 15:02
Цитата Сообщение от Slepoyi Посмотреть сообщение
Ну вот поток отработал, запустил из себя другой поток и должен освободить место. Как лучше его остановить?
Если поток отработал, то он освободается автоматически, не нужно ничего делать вручную. Interrupt или Abort используются для прерывания работы потока извне когда работа еще не завершена.

Цитата Сообщение от Slepoyi Посмотреть сообщение
И есть какой-то эффективный способ распараллеливания рекурсивных алгоритмов методами С#?
Универсального способа нет ни в c# ни в любом другом языке. Надо смотреть конкретный алгоритм.
Если есть ветвления которые не зависят от расчетных данных из других веток, то можно распаралелить.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private static async Task<int> GetMaxRecursiveAsync(int[] array, int indexFrom, int indexTo)
        {
            int result;
            if (indexTo - indexFrom > 0)
            {
                int middle = indexFrom + (indexTo - indexFrom) / 2;
                int[] max = await Task.WhenAll(
                    Task.Run(() => GetMaxRecursiveAsync(array, indexFrom, middle)),
                    Task.Run(() => GetMaxRecursiveAsync(array, middle + 1, indexTo)));
 
                result = Math.Max(max[0], max[1]);
            }
            else
            {
                result = array[indexFrom];
            }
            
            Console.WriteLine($"Max of {indexFrom}-{indexTo}: {result}");
 
            return result;
        }
0
31 / 21 / 10
Регистрация: 08.10.2017
Сообщений: 181
26.06.2019, 18:14  [ТС]
Написал то, что хотел. Программа отрабатывает, но выдаёт не всегда (~70% случаев) не то, что ожидалось. Есть ли какой-то способ отладки многопоточных программ? При отладке через точку останова нажатие F11/F10 не даёт ничего, так как отладка скачет между потоками, и невозможно понять, какой поток чем занят в данный момент времени.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.06.2019, 18:14
Помогаю со студенческими работами здесь

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

1-ая программа с потоками
Начал изучать потоки в С++ Билдере 6. Вот по книге в качестве примера с потоками набрал код, но программа не компилится, не знаю что...

Программа с параллельными потоками на C#
Добрый день, нужен исходник программы с параллельными вычислениями на C# и тема должна быть близко математическая, то есть например решение...

Программа для работы с потоками
Нужно написать программу работающую как минимум с двумя потоками - например, на экране появляются два стакана, на дно которых падают...

Сложность с потоками: программа виснет
LPVOID u1=new LPVOID(); Param* pStruct1 = reinterpret_cast&lt;Param*&gt;(u1); LPVOID u2=new LPVOID(); Param* pStruct2 =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru