【发布时间】:2018-11-05 02:15:06
【问题描述】:
我有一个问题,需要我多次执行可变长度的特定计算(通常 > 10^8),并且我有少量处理器(
我想做的是通过在每次终止时创建一个新的 pthread 来保持所有处理器忙碌。如果有办法检索当前活动 pthread 的数量,我可以轻松做到这一点,但我还没有找到方法。
这可能吗?如果有,怎么做?
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
struct arg_struct {
double x ;
double y ;
};
int nloops = 0 ; // initialize loop counter
void process(struct arg_struct *args)
{
int thisloop ;
float x,y ;
x = args->x ; y = args->y ;
free(args) ; // we're done with passed arguments
nloops++ ; // increment global counter
thisloop = nloops ; // capture current loop number
sleep(11-nloops) ; // variable delay
printf("thisloop = %d threadID = %d args = %.1f %.1f\n", thisloop, (int) pthread_self(), x, y) ;
pthread_exit(NULL); // exit thread
}
int main()
{
const int MINLOOPS = 10 ; // total number of loops to execute
const int MAXTHREADS = 4 ; // maximum number of threads at any one time
int N, remaining ;
pthread_t tid[MAXTHREADS];
while (1)
{
remaining = MINLOOPS - nloops ;
if (remaining == 0) break ;
if (remaining < MAXTHREADS)
N = remaining;
else
N = MAXTHREADS;
for (int i = 0; i < N; i++) { // create a set of simultaneous threads
struct arg_struct *args = malloc(sizeof(struct arg_struct)); // initialize arguments
args->x = i; args->y = -i ;
pthread_create(&tid[i], NULL, (void *) process, (void *) args ) ;
printf("Created thread %d\n", (int) tid[i]) ;
}
for (int i = 0; i < N; i++) // wait until all threads in current loop have completed
pthread_join(tid[i], NULL);
}
}
输出是:
Created thread 216977408
Created thread 217513984
Created thread 218050560
Created thread 218587136
thisloop = 4 threadID = 218587136 args = 3.0 -3.0
thisloop = 3 threadID = 218050560 args = 2.0 -2.0
thisloop = 2 threadID = 217513984 args = 1.0 -1.0
thisloop = 1 threadID = 216977408 args = 0.0 0.0
Created thread 216977408
Created thread 217513984
Created thread 218050560
Created thread 218587136
thisloop = 8 threadID = 218050560 args = 2.0 -2.0
thisloop = 7 threadID = 218587136 args = 3.0 -3.0
thisloop = 6 threadID = 217513984 args = 1.0 -1.0
thisloop = 5 threadID = 216977408 args = 0.0 0.0
Created thread 216977408
Created thread 217513984
thisloop = 10 threadID = 217513984 args = 1.0 -1.0
thisloop = 9 threadID = 216977408 args = 0.0 0.0
【问题讨论】:
-
您正在描述一个线程池。通常,您不会创建和销毁线程,而是一次创建它们,然后使用某种队列在它们之间分配工作。有些技术会在编译时为您执行此操作(例如 OpenMP)。
-
在下面查看我提出的解决方案。