如何为多线程分块素数?

时间:2017-04-13 09:44:00

标签: c multithreading pthreads primes

我对C来说比较新,直到现在几乎没有任何多线程经验。我编写了一个小程序来计算数字数组是素数还是复合数。这样可以正常工作,但是当处理更大的数字时,我想在线程之间分配工作负载。

我有点想知道这是如何工作的,我只是不知道如何在C中实现这个。作为一个简单的例子,如果我们采用素数199,我会把这个数除以数核心(例如4)获得49.75。然后我们将这个数字舍入到50.然后给每个线程一个计算范围。

第一个线程将从i 2到50计算,第二个从i 51到102计算,依此类推。

我希望这是有道理的,我确信解决方案比我想象的要容易,只是因为我无法解决这个问题。

我的代码:

Connection

1 个答案:

答案 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;
        }
    }
}

我希望这会有所帮助。