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编码>并结束线程。嗯,好的,我更改了它。但是现在我得到了分段错误(核心转储)错误?