分析下面代码每一步功能#include <stdio.h> #include <pthread.h> #include <time.h> #define NUM_THREADS 200 // 定义线程数量 #define MIN_NUM 30000000 // 要判断的最小数 #define MAX_NUM 30000200 // 要判断的最大数 // 判断一个数是否为素数 int is_prime(int num) { if (num <= 1) return 0; int i; for (i = 2; i * i <= num; i++) { if (num % i == 0) return 0; } return 1; } // 子线程的入口函数 void* check_prime(void* arg) { int id = (int) arg; // 获取线程的编号 int i, count = 0; for (i = MIN_NUM + id; i <= MAX_NUM; i += NUM_THREADS) { // 每个线程处理一定范围内的数 if (is_prime(i)) { printf("Thread %d: %d is prime.\n", id, i); count++; } } printf("Thread %d found %d primes.\n", id, count); pthread_exit(NULL); // 退出线程 } int main() { pthread_t threads[NUM_THREADS]; // 定义线程数组 int thread_args[NUM_THREADS]; // 线程的传递参数数组 int i, rc; clock_t start, end; double duration; start = clock(); // 记录程序启动的时间 // 创建子线程 for (i = 0; i < NUM_THREADS; i++) { thread_args[i] = i; // 设置线程参数 rc = pthread_create(&threads[i], NULL, check_prime, (void*) &thread_args[i]); // 创建线程 if (rc != 0) { printf("Error: Unable to create thread %d. Code: %d\n", i, rc); return -1; } } // 等待所有子线程结束 for (i = 0; i < NUM_THREADS; i++) { rc = pthread_join(threads[i], NULL); // 等待线程结束 if (rc != 0) { printf("Error: Unable to join thread %d. Code: %d\n", i, rc); return -1; } } end = clock(); // 记录程序结束的时间 duration = ((double) (end - start)) / CLOCKS_PER_SEC; // 计算程序运行的时间 printf("Total time elapsed: %f seconds.\n", duration); return 0; }
时间: 2024-03-18 07:43:23 浏览: 54
这段代码的主要功能是使用多线程并行地寻找一个指定区间内的所有质数,并计算程序执行的时间。
具体流程如下:
1. 定义宏 NUM_THREADS、MIN_NUM 和 MAX_NUM,分别表示线程数量、指定区间的下限和上限。
2. 定义函数 is_prime(num),用于判断一个数是否为质数。如果 num 小于等于 1,直接返回 0;否则,从 2 开始循环到 num 的平方根,如果存在某个数 i 能够整除 num,说明 num 不是质数,直接返回 0。如果循环结束时仍然没有找到能够整除 num 的数,则 num 是质数,返回 1。
3. 定义函数 check_prime(arg),作为子线程的入口函数。参数 arg 表示线程的编号。在该函数中,循环从 MIN_NUM + id 开始到 MAX_NUM,每次增加 NUM_THREADS,即每个线程处理一定范围内的数。对于每个数 i,调用 is_prime(i) 判断是否为质数。如果是质数,输出该数并将 count 加 1。最后输出该线程找到的质数个数。
4. 在主函数中,定义变量 threads 和 thread_args,分别表示线程数组和线程的传递参数数组。循环创建 NUM_THREADS 个子线程,设置每个线程的参数为线程的编号,调用 pthread_create() 函数创建线程。如果创建线程失败,输出错误信息并返回 -1。
5. 循环等待所有子线程结束,调用 pthread_join() 函数等待线程结束。如果等待线程失败,输出错误信息并返回 -1。
6. 记录程序结束的时间,计算程序运行的时间,并输出。
7. 返回 0,表示程序正常结束。
总的来说,这段代码的主要目的是演示如何使用多线程并行地寻找指定区间内的质数,并计算程序执行的时间。通过使用多线程,可以提高程序的运行效率。
阅读全文