Я расскажу о правильном ответе Беты. Все индивидуальные процессы процесса взаимодействуют друг с другом и гарантируют, что никогда не будет больше N заданий, выполняемых во всех разных make invocations, когда вы используете -jN
. В то же время они всегда гарантируют, что (при условии, что по крайней мере N заданий, которые могут быть запущены во всех make-вызовах), всегда будут выполняться N заданий.
Предположим, что у вас было 4 каталога с «чем заняться», которые каким-то образом вы могли бы знать априори, и поэтому вместо вызова одного экземпляра make с помощью -j4
и позволяющего сделать так, чтобы они вызывали 4 подпрограммы в обычном режиме, из заявлений, которые должны быть вызваны с -j1
. Теперь предположим, что в первом каталоге было 10 целей, устаревших, второе - 5, третье - 20, а четвертое - 100 устаревших целей. Сначала у вас работает 4 задания параллельно. Затем, когда будут созданы 5 целей второго каталога, у вас будет только 3 задания, которые будут выполняться параллельно, а затем 2, а затем для остальной части четвертого каталога вы будете иметь только одну цель, которая будет построена за раз и не будет параллелизма. Это намного меньше.
Как работает GNU, вместо этого общаются все четыре экземпляра make. Когда второй каталог завершен, выполняемые задания доступны для других каталогов и т. Д. К концу сборки четвертый каталог одновременно создает четыре задания. Это намного больше.
Возможно, если вы объясните , почему вы хотите это сделать, было бы более полезно для нас в построении ответа.
В последнем предложении говорится все. Единственные места, где я вижу людей, имеющих проблемы с параллельным оформлением, - это плохо определенные make-файлы. Если makefile хорошо определен, make не будет делать ошибок и будет работать оптимально; то есть нет способа, чтобы при заданном N была лучшая стратегия, чем та, которую в настоящее время используют make. – rioki