Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中使用多线程的长素数检测_C_Multithreading_Gcc_C99 - Fatal编程技术网

C语言中使用多线程的长素数检测

C语言中使用多线程的长素数检测,c,multithreading,gcc,c99,C,Multithreading,Gcc,C99,问题陈述:检测长整数是否为素数 我的逻辑: 其思想是从0迭代到sqrt(n)。如果在0到sqrt(n)之间没有找到除数,那么我可以得出结论,这个数是素数,反之则是非素数 因为,这需要是多线程的,我创建了一个名为void*PrimeDetecter(void*param)的线程函数。在这个线程函数中,我将从startIndex迭代到endIndex,如果有除数,则退出线程并将值1写入state true到变量isnumprime的地址,该变量默认设置为0 因此,在main函数中,我需要在创建线程时

问题陈述:检测长整数是否为素数
我的逻辑:
其思想是从0迭代到sqrt(n)。如果在0到sqrt(n)之间没有找到除数,那么我可以得出结论,这个数是素数,反之则是非素数
因为,这需要是多线程的,我创建了一个名为
void*PrimeDetecter(void*param)的线程函数。在这个线程函数中,我将从
startIndex
迭代到
endIndex
,如果有除数,则退出线程并将值1写入state true到变量
isnumprime
的地址,该变量默认设置为0
因此,在main函数中,我需要在创建线程时将要检查的数字、它的开始索引和结束索引发送给线程。因此,我的结构将包含
long int number、startIndex、endIndex、*除数
intisprime

然后我创建了一个大小为10的numbertime类型的数组,因为有10个线程,因此将迭代平均分割。

我在线程之间打印了索引的分布,这很好。然后我创建线程并将所有这些元素发送到线程,以检查该数字是否为素数。
这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <math.h>
#include <pthread.h>

#define MAX_NUM_THREADS 10 // Exercise 1: Not more than 10 threads can run at a time for example.

struct NumberPrime
{
    long int number, startIndex, endIndex, *divisor;
    int *isPrime;
};

void *PrimeDetector(void *param)
{
    struct NumberPrime parameters = *(struct NumberPrime *)param;
    for (long int i = parameters.startIndex; i < parameters.endIndex; i++)
    {
        if (i == 0 || i == 1)
        {
            break;
        }
        else
        {
            if ((parameters.number % i) == 0) // if the divisor is detected then number is not a prime
            {
                *(parameters.divisor) = i;
                *(parameters.isPrime) = 1; // change the value to true
                pthread_exit(0);          // exit the thread function
            }
        }
    }
}

int main(int argc, char *argv[])
{
    long int number1 = 12340000, number2 = 128;
    struct NumberPrime primeData1[MAX_NUM_THREADS];
    int isNum1Prime = 0; // false
    long int number1Divisor = 0;
    long int numberSquareRoot1 = (long int)(sqrt(number1)); // get the square root of number1

    for (int i = 0; i < MAX_NUM_THREADS; i++)
    {
        primeData1[i].number = number1;
        primeData1[i].isPrime = &isNum1Prime;
        primeData1[i].divisor = &number1Divisor;
        primeData1[i].startIndex = i * numberSquareRoot1 / MAX_NUM_THREADS;
        primeData1[i].endIndex = ((i + 1) * numberSquareRoot1) / MAX_NUM_THREADS;
    }

    pthread_t primeDetectorThread1[MAX_NUM_THREADS];
    int count = 0;
    for (int i = 0; i < MAX_NUM_THREADS; i++)
    {
        if (isNum1Prime == 1)
        {
            pthread_cancel(primeDetectorThread1[i]);
            break;
        }
        else
        {
            pthread_create(&primeDetectorThread1[i], NULL, &PrimeDetector, &primeData1[i]);
            count++;
        }
    }
    for (int i = 0; i < count; i++)
    {
        pthread_join(primeDetectorThread1[i], NULL);
    }

    isNum1Prime == 1 ? printf("Number 1 is prime.\n") : printf("Number 1 is not prime and divisible by %ld\n", number1Divisor);
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAX_NUM_THREADS 10//练习1:例如,一次运行的线程不能超过10个。
结构编号时间
{
长整数,起始索引,结束索引,*除数;
int*isPrime;
};
void*PrimeDetector(void*param)
{
struct NumberTime参数=*(struct NumberTime*)参数;
for(long int i=parameters.startIndex;i

预期的结果是该数字不是素数。但是无论我选择什么数字,我总是得到这个数字是素数。

如果((parameters.number%I)==0)
行测试一个数字是否可以被
I
整除。如果它是可除的,则该数字是而不是素数,但您的代码将继续设置
*(parameters.isPrime)=1并结束线程。

嗯,好的,我更改了它。但是现在我得到了分段错误(核心转储)错误?