我对C来说比较新,直到现在几乎没有任何多线程经验。我编写了一个小程序来计算数字数组是素数还是复合数。这样可以正常工作,但是当处理更大的数字时,我想在线程之间分配工作负载。
我有点想知道这是如何工作的,我只是不知道如何在C中实现这个。作为一个简单的例子,如果我们采用素数199,我会把这个数除以数核心(例如4)获得49.75。然后我们将这个数字舍入到50.然后给每个线程一个计算范围。
第一个线程将从i 2到50计算,第二个从i 51到102计算,依此类推。
我希望这是有道理的,我确信解决方案比我想象的要容易,只是因为我无法解决这个问题。
我的代码:
Connection
答案 0 :(得分:1)
所以你想要做的是有不同的线程来检查不同的非重叠范围。
我们首先需要一个struct来将范围传递给worker。所以我们从 -
开始typedef struct {
int lower;
int upper;
int number;
int result;
} worker_range;
现在主要是我假设您需要检查199并且每个线程需要检查50个值。
我们这样开始
worker_threads **ranges = malloc(sizeof(worker_threads*) * (199 / 50 + 1));
现在我们需要产生线程
int i;
for ( i = 0; i < 199 / 50 + 1; i++){ //Fix this so that extra threads are not spawned.
ranges[i] = malloc(sizeof(worker_range));
ranges[i]->number = 199;
ranges[i]->lower = 2 + i * 50;
ranges[i]->upper = range->lower + 50; //We are probably okay with a bit of overflow
range[i]->result = 0;
pthread_create(&thread[i], NULL, work, ranges[i]);
}
现在所有线程都已启动,我们等待它们完成。
int flag = 0;
for ( i = 0 ;i < 199 / 50 + 1; i++) {
pthread_join(thread[i]);
if(ranges[i]->result == 1)
flag = 1;
free(ranges[i]);
}
if (flag==1){
printf("%d is composite\n",199);
}else{
printf("%d is prime\n",199);
}
free(ranges);
最后是工人职能 -
void* work(void * param) {
work_range *range = param;
int i;
for(i = range->lower, i < range->upper; i++){
if (range->number % i == 0){
(range->result) = 1;
break;
}
}
}
我希望这会有所帮助。