Форум: "Прочее";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
ВнизПодскажите главу Найти похожие ветки
← →
vrem (2008-06-08 10:20) [0]Задача решается в два этапа - на первом этапе получаются данные для работы второго этапа(По времени всё разное) Вопрос - как правильно распараллелить такую задачу на два процессорных ядра?
Что то вроде - первый этап создаёт данные, кладёт их в массив, второй этап если видит, что в массиве есть для него работа, и начинает работать.
Потоки и т.д. - всё очень объёмно читать, может есть глава как раз про вот такой случай?
← →
TUser © (2008-06-08 10:32) [1]Первый генерит нечто (например, освобождает мьютекс), если появились новые данные. Или просто сообщение шлет второму.
← →
Zeqfreed © (2008-06-08 10:47) [2]Все зависит исключительно от того, что второй этап делает с данными.
← →
Юрий Зотов © (2008-06-09 09:03) [3]Если два этапа должны выполняться строго последовательно, то зачем их вообще распараллеливать?
← →
Mystic © (2008-06-09 11:37) [4]Либо изучай потоки, либо пиши на всяких языках типа Haskell (медленно работает, зато не надо усилий для распараллеливания).
← →
shlst (2008-06-09 11:54) [5]Юрий Зотов © (09.06.08 09:03) [3]
Что бы первый этап мог выполняться параллельно с работой второго
1)выкапывать картошку
2)складывать в ящики
пока новую картошку выкапывают уже выкопанную складывают в ящики(а не ждут, пока вся картошка будет выкопана что бы приступить к складыванию)
← →
clickmaker © (2008-06-09 12:48) [6]Поток для выкапывания:
while ...
Накопали
Event.Set;
end;
Поток для складывания:
while ...
Event.Wait;
Складываем
end;
← →
KSergey © (2008-06-09 12:53) [7]Ну откройте книжку и почитайте главу про потоки.
Или указать книжку и страницу?
Я не понимаю вопроса, если честно.
Боюсь только с таким подходом все будет идти в русле "о, сколько нам открытий чудных..."
← →
Юрий Зотов © (2008-06-09 15:51) [8]> shlst (09.06.08 11:54) [5]
Выкапывание НОВОЙ картошки - это НОВЫЙ этап, а не продолжение старого.
1. Главный поток ждет.
2. Ему поступает запрос - "хочу порцию картошки".
3. Главный поток запускает рабочий поток и снова ждет.
4. Рабочий поток выкапывает порцию картошки, складывает ее в ящики и завершается. Все.
И поскольку складыванию ОБЯЗАТЕЛЬНО предшествует выкапывание (иначе и складывать нечего), то распараллеливание ЭТИХ операций не имеет никакого смысла.
← →
Тын-Дын © (2008-06-09 15:56) [9]Единственный смысл в распараллеливании может быть, если процессы выкапывания и складывания чередуются очень быстрою В этом случае имеет смысл 2 потока держать всегда наготове (в том случае, если один из потоков, кроме выкапывания или складывания ещё и другим делом занимается).
← →
MBo © (2008-06-09 16:11) [10]>1)выкапывать картошку
>2)складывать в ящики
>пока новую картошку выкапывают уже выкопанную складывают в ящики(а не ждут, пока вся картошка будет выкопана что бы приступить к складыванию)
В простейшем случае, например, при использовании массива с неизменной длиной, достаточно сообщать (PostMessage, например) 2 потоку о том, какие ячейки можно использовать, и более синхронизации, связанной с данными, более не требуется.
Для некоторых более сложных задач подойдет TMultiReadExclisiveWriteSynchronizer из Дельфи, или, например, такая техника :
http://mbo88.narod.ru/ToC.html
10 глава
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c