C语言编写一个多线程的程序,计算某个指定范围内的质数个数,Linux系统
时间: 2024-05-13 13:17:42 浏览: 159
Linux下的多线程(C语言)
以下是一个使用C语言和Linux系统多线程编写的计算质数个数的程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_THREADS 10 // 最大线程数
#define MAX_NUM 100000 // 范围上限
int num_threads; // 线程数
int prime_count = 0; // 质数个数
int sieve[MAX_NUM + 1]; // 筛子数组
void *thread_func(void *arg) {
int thread_id = *(int *)arg;
int start = thread_id * (MAX_NUM / num_threads) + 2; // 起始数
int end = (thread_id + 1) * (MAX_NUM / num_threads) + 1; // 结束数
// 筛法求质数
for (int i = 2; i * i <= MAX_NUM; i++) {
if (!sieve[i]) {
for (int j = i * i; j <= MAX_NUM; j += i) {
sieve[j] = 1;
}
}
}
// 计算质数个数
for (int i = start; i <= end; i++) {
if (!sieve[i]) {
prime_count++;
}
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t threads[MAX_THREADS]; // 线程数组
int thread_ids[MAX_THREADS]; // 线程ID数组
// 获取命令行参数
if (argc != 2) {
fprintf(stderr, "Usage: %s <num_threads>\n", argv[0]);
exit(EXIT_FAILURE);
}
num_threads = atoi(argv[1]);
if (num_threads > MAX_THREADS) {
fprintf(stderr, "Maximum number of threads is %d\n", MAX_THREADS);
exit(EXIT_FAILURE);
}
// 创建线程
for (int i = 0; i < num_threads; i++) {
thread_ids[i] = i;
if (pthread_create(&threads[i], NULL, thread_func, (void *)&thread_ids[i]) != 0) {
fprintf(stderr, "Error creating thread\n");
exit(EXIT_FAILURE);
}
}
// 等待线程完成
for (int i = 0; i < num_threads; i++) {
if (pthread_join(threads[i], NULL) != 0) {
fprintf(stderr, "Error joining thread\n");
exit(EXIT_FAILURE);
}
}
// 输出结果
printf("Number of primes: %d\n", prime_count);
return 0;
}
```
程序首先读取命令行参数,即线程数。然后创建多个线程,在每个线程中使用筛法求质数,并计算在指定范围内每个线程负责的质数个数。最后,等待所有线程完成并将每个线程计算得到的质数个数相加,输出结果。
注意,本程序中的线程是通过Linux系统提供的pthread库实现的。如果编译时需要链接该库,请加上-lpthread选项。例如:
```
gcc -o primes primes.c -lpthread
```
阅读全文