2014-10-22 2 views
1

У меня есть программа, которую я должен выполнять 100 раз с разными аргументами каждый раз, используя мои 10 процессоров.Команда queue multiple system() с использованием C++

Так что в основном я хочу сделать несколько системных вызовов, чтобы закончить мой список. Однако, если я просто поставлю system() в цикле for, он будет использовать только один процессор, и он будет идти один за другим. Как я могу открыть несколько терминалов, которые могут запускать разные программы одновременно, и в конце отчета, который они закончили, позволяя мне назначить этому конкретному процессору новую задачу из пула?

Спасибо заранее

+1

Возможно, вы могли бы сделать один системный вызов в GNU параллельно, попросив его скоординировать параллельную работу? См. [Справочная страница здесь] (http://www.gnu.org/software/parallel/man.html). –

+0

Вы хотите, чтобы очереди процессов, * и * запускали их одновременно? – juanchopanza

+0

Мои задания больше, чем мои процессоры, поэтому я хочу запускать столько же, сколько мои работы с процессорами параллельно, оставаясь только в пуле остальных. – user4168715

ответ

3

Вы должны прочитать о системных вызовах fork, exec и wait.

В принципе вы делаете комбинацию fork/exec для каждого подпроцесса и записываете свой PID. Когда у вас есть все процессы, которые вы хотите использовать, используйте wait или вариант, ожидающий завершения. Затем вы можете использовать возвращаемые значения, начать другой процесс и т. Д.

+0

А также связанный с ней «waitpid» syscall. Прочтите [Advanced Linux Programming] (http://advancedlinuxprogramming.com/): у него есть несколько глав по этому вопросу. И вам, вероятно, следует избегать одновременного размножения сотен процессов (только не более десятков). –

1

Вместо этого я рекомендую использовать popen(). system() не является хорошим вариантом для этого. Вы можете открыть столько потоков, сколько хотите (в пределах разумного), и общаться с каждым из процессов независимо). popen() обертывает fork + pipe + exec, и процессы будут запланированы ОС, независимо от вашего родительского процесса.

Или подумайте о том, чтобы реализовать свои собственные, используя fork/exec. Вы можете использовать waitpid и т. Д., Чтобы проверить статус отдельных PID, чтобы узнать их код выхода, хотя мне нравится использовать popen() с более богатой обратной связью, анализируя текстовое сообщение возврата из программы.

+0

«Недостаток к popen - это получение статуса выхода ребенка, вы не можете» - вы видели какую-то проблему с его получением во время вызова «pclose»? –

+1

@TonyD - Честно говоря, я не помню проблем с pclose(), обычно, если я использую popen(), потому что я взаимодействую с процессом по тексту, а затем, когда я закончил, я pclose() и огонь и забыть. Но когда я проверил man-страницу несколько минут назад для кода ошибки перед ответом, я неправильно понял документ и подумал, что он сказал: 'pclose() не может получить дочерний статус', когда он говорит' If pclose() не может ... 'так не думая, что я просто повторил это. Я буду честен, несмотря на неправильное понимание этого, я не помню, чтобы когда-либо знал, что pclose() вернул статус выхода, всегда предполагал, что это абстракция FILE. – codenheim

+0

Я исправил свой ответ (@TonyD указал на мою ошибку). Я думаю, правда на этой стороне 40, я начинаю забывать то, что знал ... или если я даже знал это, я не помню сейчас ...: D – codenheim

Смежные вопросы