毎回 5 つのコアを使用して、6 コアのコンピューターで 25 個の CPU 集中型タスクを (たとえば) 実行したい (つまり、他のタスク用に 1 つを残します)。25 個の CPU 集中型タスクはそれぞれ異なる時間に終了する可能性があります。たとえば、あるタスクは 20 分で終了し、他のタスクは最大 4 時間かかる場合があります。
pthreads を使用して、5 つのスレッドを起動し、その完了を待って、別の 5 つのスレッドを再度起動できる非常に単純なアルゴリズムを構築することができました。このアルゴリズムの弱点は、異なるスレッドが異なる時間に終了する可能性があるという事実を利用できないことです。代わりに、別のセットを起動する前に、5 つのスレッドすべてのジョブの完了を常に待機します。
スレッドを起動するコードの抜粋を次に示します。
#define MAX_REACTOR_THREADS 5
/* ....................... */
/* SOME LENGTHY STUFF HERE */
/* ....................... */
int cases = 25;
pthread_t *threads_REACTOR = calloc(cases, sizeof(pthread_t));
int index = 0;
/* CALL THREADS PROCEDURE FOR COMPUTING FUNCTION: REACTOR_THREAD */
int int_div = cases/MAX_REACTOR_THREADS;
int I, k;
for (I=0; I<int_div; I++){
/* LAUNCH THREADS */
for(k=0; k<MAX_REACTOR_THREADS; k++){
index = int_div*k+I;
pthread_create(&threads_REACTOR[index], NULL,
&REACTOR_THREAD, (void*) &inputs_array[index]);
}
/* JOIN THREADS */
for(k=0; k<MAX_REACTOR_THREADS; k++){
index = int_div*k+I;
pthread_join(threads_REACTOR[index], NULL);
}
/* HERE PRINT PROGRESS BAR */
Progress_Bar((I+1)*MAX_REACTOR_THREADS, cases, 40, COLOR_Y);
}
if((cases%MAX_REACTOR_THREADS) != 0){
/* LAUNCH REMAINING THREADS */
for(index=MAX_REACTOR_THREADS*int_div; index<cases; index++){
pthread_create(&threads_REACTOR[index], NULL,
&REACTOR_THREAD, (void*) &inputs_array[index]);
}
/* JOIN REMAINING THREADS */
for(index=MAX_REACTOR_THREADS*int_div; index<cases; index++){
pthread_join(threads_REACTOR[index], NULL);
/* HERE PRINT PROGRESS BAR */
Progress_Bar(index+1, cases, 40, COLOR_Y);
}
}
/* ....................... */
/* SOME LENGTHY STUFF HERE */
/* ....................... */
スレッドがその仕事を終えた瞬間に新しいタスクを起動できるようにするには、これをどのように改善できますか?