编写一个Pthreads程序实现一个任务队列实验。主线程启动用户指定数量的线程这些线程进入条件等待状态。主线程生成一些任务一定计算量每生成一个新的任务就用条件变量唤醒一个线程当这个唤醒线程执行完任务时回到条件等待状态。当主线程生成完所有任务设置全局变量表示再没有要生成的任务了并用一个广播唤醒所有线程。为了清晰起见建议任务采用链表操作。写一个实验报告内容包括:一、设计思想二、运行结果三、结果分析四、
设计思想:
- 使用一个任务队列(链表)来存储任务,主线程负责生成任务并加入队列。
- 主线程启动用户指定数量的线程,这些线程进入条件等待状态。
- 主线程循环生成任务,每生成一个新的任务,就用条件变量唤醒一个线程。
- 当线程被唤醒后,执行任务,并回到条件等待状态。
- 当主线程生成完所有任务后,设置全局变量表示没有要生成的任务了,并用一个广播唤醒所有线程。
- 线程在任务队列为空且全局变量为真时退出。
运行结果: 运行结果将显示线程的执行情况,包括线程的ID和处理的任务数量。
结果分析: 通过观察运行结果,可以看到每个线程都被唤醒并处理了一定数量的任务。
遇到问题及解决办法: 在编写过程中可能会遇到线程同步的问题,需要正确使用互斥锁和条件变量来保证线程间的同步。在本实验中,需要注意主线程和工作线程之间的同步,确保任务的正确分配和执行。
程序源码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 4
typedef struct task_node {
int task_id;
struct task_node* next;
} TaskNode;
TaskNode* task_queue = NULL;
pthread_mutex_t task_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t task_available_cond = PTHREAD_COND_INITIALIZER;
int num_tasks = 0;
int done = 0;
void* worker(void* arg) {
int thread_id = *((int*)arg);
int tasks_done = 0;
while (1) {
pthread_mutex_lock(&task_queue_mutex);
while (task_queue == NULL && !done) {
pthread_cond_wait(&task_available_cond, &task_queue_mutex);
}
if (task_queue == NULL && done) {
pthread_mutex_unlock(&task_queue_mutex);
break;
}
TaskNode* task = task_queue;
task_queue = task->next;
pthread_mutex_unlock(&task_queue_mutex);
// Process the task
printf("Thread %d processing task %d\n", thread_id, task->task_id);
tasks_done++;
free(task);
}
printf("Thread %d done. Processed %d tasks\n", thread_id, tasks_done);
pthread_exit(NULL);
}
void generate_tasks(int num_tasks) {
TaskNode* tail = NULL;
for (int i = 0; i < num_tasks; i++) {
TaskNode* task = (TaskNode*)malloc(sizeof(TaskNode));
task->task_id = i;
task->next = NULL;
if (tail == NULL) {
task_queue = task;
} else {
tail->next = task;
}
tail = task;
}
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
generate_tasks(10);
num_tasks = 10;
for (int i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i+1;
pthread_create(&threads[i], NULL, worker, &thread_ids[i]);
}
pthread_mutex_lock(&task_queue_mutex);
done = 1;
pthread_cond_broadcast(&task_available_cond);
pthread_mutex_unlock(&task_queue_mutex);
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("All threads done\n");
return 0;
}
实验报告如上所示,其中包含了设计思想、运行结果、结果分析、遇到问题及解决办法以及程序源码
原文地址: http://www.cveoy.top/t/topic/h6Cr 著作权归作者所有。请勿转载和采集!