我想在我的6核计算机中运行(比方说)25个CPU密集型任务,每次使用5个核心(因此剩下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 */
/* ....................... */
如何改进,以便在线程完成工作时启动新任务?