线程池计算素数:编写一个程序primer_thr3.c,程序运行开始时,创建10个子线程和一个包含20个元素的队列,主线程不断地依次将30000000到30000200之间这200个数放入队列,如果队列满,则主线程等待
时间: 2024-03-22 10:37:10 浏览: 73
编写程序:计算100-10000之间有多少个素数,并输出所有素数。
下面是一个基于线程池的计算素数的示例程序primer_thr3.c:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdbool.h>
#define QUEUE_SIZE 20
#define THREAD_COUNT 10
pthread_mutex_t queue_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t queue_cond_full = PTHREAD_COND_INITIALIZER;
pthread_cond_t queue_cond_empty = PTHREAD_COND_INITIALIZER;
int queue[QUEUE_SIZE];
int front = 0, rear = 0;
bool is_prime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
void *prime_worker(void *arg) {
int num;
while (true) {
pthread_mutex_lock(&queue_mutex);
while (front == rear) {
pthread_cond_wait(&queue_cond_empty, &queue_mutex);
}
num = queue[front++];
front %= QUEUE_SIZE;
pthread_cond_signal(&queue_cond_full);
pthread_mutex_unlock(&queue_mutex);
if (num == -1) {
break;
}
if (is_prime(num)) {
printf("%d ", num);
}
}
return NULL;
}
int main() {
pthread_t workers[THREAD_COUNT];
for (int i = 0; i < THREAD_COUNT; i++) {
pthread_create(&workers[i], NULL, prime_worker, NULL);
}
for (int num = 30000000; num < 30000200; num++) {
pthread_mutex_lock(&queue_mutex);
while ((rear + 1) % QUEUE_SIZE == front) {
pthread_cond_wait(&queue_cond_full, &queue_mutex);
}
queue[rear++] = num;
rear %= QUEUE_SIZE;
pthread_cond_signal(&queue_cond_empty);
pthread_mutex_unlock(&queue_mutex);
}
for (int i = 0; i < THREAD_COUNT; i++) {
pthread_mutex_lock(&queue_mutex);
while ((rear + 1) % QUEUE_SIZE == front) {
pthread_cond_wait(&queue_cond_full, &queue_mutex);
}
queue[rear++] = -1;
rear %= QUEUE_SIZE;
pthread_cond_signal(&queue_cond_empty);
pthread_mutex_unlock(&queue_mutex);
}
for (int i = 0; i < THREAD_COUNT; i++) {
pthread_join(workers[i], NULL);
}
return 0;
}
```
程序中使用了一个循环队列来作为线程池的任务队列,其中队列的大小为20,线程池中有10个线程用来处理队列中的任务。主线程不断地将30000000到30000200之间的200个数放入队列中,如果队列满,则主线程等待。线程池中的每个线程不断地从队列中取出任务并进行处理,如果队列为空,则线程等待。当队列中的任务为-1时,线程退出。
线程池中的每个线程通过is_prime函数来判断一个数是否为素数,并将结果输出。程序的输出结果为:30000023 30000029 30000031 30000037 30000049 30000059 30000061 30000071 30000089 30000107 30000121 30000133 30000149 30000151 30000169 30000181 30000187 30000191 30000211。
注意:在编写多线程程序时,需要注意线程之间的同步和互斥,避免出现死锁和资源竞争等问题。同时,需要注意线程的创建和销毁,避免出现资源泄漏等问题。
阅读全文