LINUX.ORG.RU

многопоточная программа?


0

0

Здравствуйте. Возможно ли, и как, сделать следующее:

Запускается программа, обрабатывает порцию данных (не очень долго по времени), затем вызывается функция, которая может работать долго. В то время, пока она работает, хотелось бы начать обработку новых данных, и снова их передать этой функции. И нужно еще проверить, что вернула функция.

Как такое можно реализовать ? Нужно ессно на Си и в линухе.

Заранее спасибо.

anonymous

х.з.

что именно Вы имели ввиду(кусок кода..) ?

loge
()

если действовать тупо и просто, нужно сделать две программы -- длинную и короткую. короткая обрабатывает порцию данных и выводит на stdout, длинная читает этот вывод считает, и выводит куда-нибудь результат; и шелл-скрипт, который сохраняет вывод короткой программы в файлах в какой-нибудь директории и поочерёдно скармливает из длинной. если это для вычислений, а не какой-нибудь сервер -- вполне разумное решение.

anonymous
()

Нет, желательно сделать все в одной программе. Кусок кода привести не могу. Могу попробовать пояснить - программа получает большой объем данных. Берет оттуда по частям(независимы друг от друга), делает предварительную обработку, и скармливает функции основной (ее результаты тоже не зависимы друг от друга). Так вот хотелось бы что бы программа продолжала готовить и скармливать данные этой функции во время ее работы. Ну т.е. чтобы к примеру одновременно работало 10 таких функций и сама программы. Pthread мне поможет ?

anonymous
()
Ответ на: комментарий от anonymous

>Pthread мне поможет ?

Ну судя по тому, что ты пытаешся объяснить, да, поможет.

anonymous
()

Ну так и используй thread pool + очередь. Совершенно стандартный шаблон для такого типа задач.

Алгоритм такой: генерится N ожидающих тредов, 1 тред висит на голове очереди запросов и очереди свободных тредов. Каждый раз, как обе очереди разблокируются одновременно, выбирается запрос из очереди запросов и тред из очереди свободных тредов, запрос отдаётся треду на выполнение, выбираем следующую пару, пока одна из очередей не заблокируется.

Ещё один тред скармливает в хвост очереди запросов поступающие данные (так же и сами обработчики могут в очередь запросов что либо добавлять).

Howler
()
Ответ на: комментарий от nil5

если "медленная" ф-я работает в среднем больше 10мс то целесообразность использования тредов довольно сомнительна. Потери быстродействия здеся будут несущественными а вот проблемы созданные тредами .....

cvv ★★★★★
()
Ответ на: комментарий от cvv

Кстати, вышеописанный вариант с очередью запросов тривиально подменяется однопоточной реализацией - достаточно переписать только лишь саму очередь, остальной код трогать не надо. Так что - настоятельно рекомендую, это суть есть наиболее общее решение.

Howler
()

fork() наверное проще будет. Хотя я особо не юзал ни то, ни то. Как тогда лучше сделать ограничение числа одновременно работающих дочерних процессов ? При этом желательно сохранять возвращаемое процессом значение

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.