Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Подскажите главу   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
15-1212990982
denic
2008-06-09 09:56
2008.07.27
ЭВМ


2-1214288805
Sergey2
2008-06-24 10:26
2008.07.27
Нажатие кнопки мыши.


15-1213180802
Petr V. Abramov
2008-06-11 14:40
2008.07.27
А есть ли тут кто из Серпухова?


2-1214480489
lewka-serdceed
2008-06-26 15:41
2008.07.27
Поиск слова в строке


15-1213086652
Alexander
2008-06-10 12:30
2008.07.27
DBGrid с поддержкой Unicode