多线程计算素数:编写一个程序primer_thr2.c,程序运行开始时,创建200个子线程,主线程等待这200个子线程结束;200个子线程分别判断30000000到30000200之间的200个数是否为素数,如果是素数则输出这个数。运行10次primer_thr2,记录每次运行的时间,并计算平均运行时间。
时间: 2024-03-08 07:47:46 浏览: 50
多线程查找素数
5星 · 资源好评率100%
以下是primer_thr2.c的代码实现,使用pthread库创建线程,并且利用pthread_join让主线程等待所有子线程结束。在线程函数is_prime中,我们使用了标准的素数判断算法,判断一个数是否为素数。
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#define NUM_THREADS 200
#define NUM_PRIMES 200
int is_prime(int n) {
if (n <= 1) {
return 0;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
void *thread_func(void *arg) {
int start = *(int*)arg;
for (int i = start; i < start + NUM_PRIMES; i++) {
if (is_prime(i)) {
printf("%d is a prime number\n", i);
}
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_args[NUM_THREADS];
clock_t start, end;
double cpu_time_used;
start = clock();
for (int i = 0; i < NUM_THREADS; i++) {
thread_args[i] = 30000000 + i * NUM_PRIMES;
pthread_create(&threads[i], NULL, thread_func, &thread_args[i]);
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
end = clock();
cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("Time taken: %f seconds\n", cpu_time_used);
return 0;
}
```
接下来是主函数main()的实现逻辑:
1. 创建200个线程,每个线程负责判断30000000到30000200之间的200个数是否为素数。
2. 主线程等待所有子线程结束。
3. 输出程序的运行时间。
最后,我们可以运行程序10次,并计算平均运行时间。
阅读全文