c - 为什么我的 pthread 程序缺少素数?

标签 c pthreads

我正在开发一个在 C 语言中使用 pthread 的程序。线程的功能是根据用户在 CLI 中输入的最大数字来计算素数。例如,用户输入 ./ComputePrimes 20,输出应该是 2, 3, 5, 7, 11, 13, 17, 19

但是,由于某种原因,我的程序仅输出 2 到 13(因此我的输出为 2, 3, 5, 7, 11, 13)。

我使用基于威尔逊定理的公式来计算素数: https://en.wikipedia.org/wiki/Formula_for_primes

我从过去上过的离散数学课上知道,计算素数没有可靠的公式。然而,这个程序的目的是演示 pthreads,我相信我已经成功完成了。这是我的程序:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>


void *generatePrimeNumbers(void *primenum) {
    int  i, j, a, b;
    int primeNumbers[] = {};
    int limit = (int *)primenum;

    for (i = 1; i <= limit; i++) {
           j = 0;
           int a = (factorial(i) % (i + 1));
           int b =  (i - 1) + 2;
           if (((a / i) * b) != 0) {
               primeNumbers[j] = ((a / i) * b);
               printf("%d ", primeNumbers[j]);
               j++;
           }
    }
    printf("\n");
    return NULL;
}

int factorial(int n) {
    if (n == 1) {
        return 1;
    } else return n * factorial(n - 1);

}


int main(int argc, char *argv[]) {
    int numLimit;
    pthread_t primethread;
    if (argc != 2) {
       printf("You need to enter a valid number!\n");
       exit(-1);
   }
   else {
       int i = 0;
       numLimit = atoi(argv[1]);
       if (numLimit < 2) {
               printf("Please enter a number greater than or equal to 2.\n");
               exit(-1);
       }
   }

     pthread_create(&primethread, NULL, generatePrimeNumbers, (void *)numLimit);
     pthread_exit(NULL);
}

正如您在下面看到的,我成功创建了一个线程,但是缺少一些素数。我相信我可能在我调用的线程函数中的某个地方搞砸了。谢谢!

最佳答案

在许多环境中,int只能存储最大2147483647(2**31 - 1)的整数,而20! = 2432902008176640000 。因此,factorial(20)无法正确计算。

factorial的返回类型设置为long long将使输入20的输出正确(假设long long最多可以保存2 **63 - 1),但对于较大的数字,您应该考虑其他方法,例如在数字变得太大之前在 factorial 方法中取模。

另请注意该行

int limit = (int *)primenum;

看起来很奇怪。强制转换应该是 int,而不是 int *

另一点是,正如退休忍者所说,您正在将数字分配给 0 元素数组。 在此代码中,除了打印点之外,没有使用 primeNumbers,因此应该像

一样直接进行打印
printf("%d ", ((a / i) * b));

关于c - 为什么我的 pthread 程序缺少素数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49101321/

相关文章:

c - Internet Explorer 地址空间

并发多线程

c++ - 不能在 C++ 中引发优先级倒置

android - Linux 2.6内核进程管理

将一个值从一个结构阵营复制到另一个结构但数据类型相同

c - 路由追踪理论

c - excel中调用.exe库的Malloc错误

c++ - 是什么让两个数组映射到同一个缓存行?

linker - LLVM 将 pthread 函数调用插入 IR

c - 在线程之间划分工作? (并行线程)