![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
Есть программа вычисляющая некоторую функцию, выглядит она примерно так:
Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Код:
Код:
OnTerm нужно описать как событие. Ну и сама задумка мне представляется с граблями...
I'm learning to live...
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
Мне и самому задумка кажется корявой, но особого опыта в работе с потоками нет, потому мне и нужен пинок в правильную сторону.
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Каждая функция (из трех) в своем потоке.
Поток при завершении записывает две переменные: результат и флаг. После чего посылает основному окну сообщение. Получив сообщение, основная программа проверяет все 3 флага. Если все установлены - берет из переменных результаты и считает последнюю функцию. |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> разбить это дело на 3 потока
если проц не 4-х головый, то смысла нет. Количество потоков <= количество ядер. Проще всего это реализовать через семафор CreateSemaphore(), установленный на количество ядер. Тогда можно сделать так, что на 4-х ядерном проце у вас будет считаться 4 функций сразу, на 16-ти ядерном 16 и т.д. Т.е. максимальная масштабируемость. Синхронизацию по окончанию работы обычно делают через ивенты CreateEvent(). Fxyz() ждёт ивенты от 3 потоков через WaitForMultiplyObjects(). И ещё, создание потока — тяжелая операция, а т.к. зависят они только от i (как я понимаю), то нет смысла прибивать поток, чтобы через секунду запустить его же с другим i. Костыль с циклом Application.ProcessMessages(); действительно кривой. Проще засунуть это в отдельный поток, запустить его, и спокойно сидеть в гуе, ожидая событий от цикла.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
veniside, допустим у меня проц на два ядра, а потоков три, на сколько сильно они будут друг другу мешать? И еще, если не убивать поток после завершения, он просто запускается ф-цией Resume, или тут есть какая то хитрость?
В моем примере на входе Fx, Fy, Fz, стоят конкретные числа, на самом деле данные на все три ф-ции берутся из одного массива. Соответственно, чтоб небыло проблем с доступом, приходится делать синхронизацию, но в этом случае идет задержка при чтении, либо приходится копировать массив в каждый поток, что тоже занимает время. Как тут правильно сделать доступ к данным в массиве? Последний раз редактировалось gusluk; 31.05.2012 в 04:02. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> на сколько сильно они будут друг другу мешать?
просто не будет выигрыша в производительности, но и падения сильного тоже не будет, так что можно оставить и 3. Просто это не масштабируемое решение, на 4-х ядерном не будет использоваться 1 ядро. > он просто запускается ф-цией Resume, или тут есть какая то хитрость? я бы построил тело потока так: Код:
> все три ф-ции берутся из одного массива ... Как тут правильно сделать доступ к данным в массиве? они меняют что-то в этом массиве или только читают из него?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 31.05.2012 в 10:02. |
![]() |
![]() |
![]() |
#8 | |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
если Fx(), Fy(), Fz() активно меняют переданный им массив в любой точке, то их вобще нельзя параллельно запускать. Ну или синхронизировать каждую запись, что в общем бессмысленно, т.к. получится, кто первый, тот и наменял. И каждый раз первым может быть другой поток.
Думаю, что меняют они только определенную область, типа результат. При этом для Fx(), Fy(), Fz() эта область не пересекается. Иначе, см. выше. > результат расчетов Fxyz записывается в исходный массив если только Fxyz() меняет массив, то это другое дело. Она будет это делать только когда Fx(), Fy(), Fz() уже отработали текущее задание, т.е. нужна только одна синхронизация на окончание работы всех трёх функций (WaitForMultipleObjects).
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#10 | |||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]() Цитата:
Если задачу удается распараллелить на 3 независимые части, то ядра, начиная с 4-го, будут "курить". И сделать с этим ничего нельзя. Какими бы средствами мы это ни пытались. Поэтому "смысла нет" - заявление, мягко говоря, опрометчивое. Другое дело, цикл заставляет задуматься, что, возможно, допустимо сначала насчитать все 3 функции для всех вариантов, и только потом подводить все итоги одновременно. В этом случае я бы запустил сразу все 30 потоков. При этом периоды ожидания, когда два закончившихся потока ждут третий, минимизируется. Вопрос лишь в том, допустимо ли это по условиям задачи. И еще. Если уж мы не ограничены 3-мя потоками, то и подгонять количество потоков под число ядер не вижу смысла - практика показывает, что сотню потоков процессор держит без сколько-нибудь заметного ущерба для производительности. Цитата:
Цитата:
|
|||
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
оптимальный план замены оборудования | DampuL | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 23.12.2010 16:04 |
Оптимальный поиск и сравнение строк | Utkin | Общие вопросы по программированию, компьютерный форум | 19 | 30.06.2010 14:54 |
нужно найти оптимальный путь | Marina87 | Фриланс | 16 | 29.04.2010 16:01 |
оптимальный размер окна программы | street-walker | Общие вопросы Delphi | 10 | 06.01.2010 00:04 |