#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <omp.h>\n\n#define MAX_LINE_LENGTH 100\n\n// 定义一个全局的队列结构体\ntypedef struct {\n char lines[MAX_LINE_LENGTH][MAX_LINE_LENGTH];\n int front;\n int rear;\n} Queue;\n\n// 初始化队列\nvoid initQueue(Queue *q) {\n q->front = 0;\n q->rear = 0;\n}\n\n// 入队\nvoid enqueue(Queue *q, char *line) {\n strcpy(q->lines[q->rear], line);\n #pragma omp atomic\n q->rear = (q->rear + 1) % MAX_LINE_LENGTH;\n}\n\n// 出队\nvoid dequeue(Queue *q, char *line) {\n strcpy(line, q->lines[q->front]);\n #pragma omp atomic\n q->front = (q->front + 1) % MAX_LINE_LENGTH;\n}\n\n// 生产者函数\nvoid producer(Queue *q, char *filename) {\n FILE *file = fopen(filename, "r");\n if (file == NULL) {\n printf("Error opening file %s\n", filename);\n exit(1);\n }\n\n char line[MAX_LINE_LENGTH];\n while (fgets(line, sizeof(line), file) != NULL) {\n // 将文本行插入到队列中\n #pragma omp critical\n {\n enqueue(q, line);\n }\n }\n\n fclose(file);\n}\n\n// 消费者函数\nvoid consumer(Queue *q) {\n char line[MAX_LINE_LENGTH];\n while (1) {\n // 从队列中取出文本行\n #pragma omp critical\n {\n if (q->front == q->rear) {\n // 队列为空,退出循环\n break;\n }\n dequeue(q, line);\n }\n\n // 分词并输出单词\n char *token = strtok(line, " \t\n");\n while (token != NULL) {\n printf("Word: %s\n", token);\n token = strtok(NULL, " \t\n");\n }\n }\n}\n\nint main() {\n Queue q;\n initQueue(&q);\n\n int num_producers = 2;\n int num_consumers = 2;\n\n // 设置线程数量\n omp_set_num_threads(num_producers + num_consumers);\n\n // 创建生产者线程\n #pragma omp parallel for\n for (int i = 0; i < num_producers; i++) {\n char filename[20];\n sprintf(filename, "file%d.txt", i);\n producer(&q, filename);\n }\n\n // 创建消费者线程\n #pragma omp parallel for\n for (int i = 0; i < num_consumers; i++) {\n consumer(&q);\n }\n\n return 0;\n}

OpenMP生产者-消费者模型:使用共享队列进行文本分词

原文地址: https://www.cveoy.top/t/topic/pVI8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录