作业要求
使用$OpenMP$实现生产者-消费者程序:多个线程中的一部分线程是生产者,另外一部分线程是消费者。假设有$n$个生成者和$n$个文件集合,每个生产者针对一个文件读取文本,并将读出的文本行插入到一个共享的队列中。消费者从共享队列中取出文本行,并对文本行进行分词。消费者在分词时,发现一个单词就将该单词输出到$stdout$
要求:至少$4$个文件集合
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream> #include <omp.h> #include <queue> #include <fstream>
signed main() { omp_set_num_threads(8); std::queue<std::string> q; int ok = 0;
#pragma omp parallel shared(q, ok) { int tid = omp_get_thread_num(); if (tid >= 1 && tid <= 4) { std::string path = ""; path += char(tid + '0'); path += ".txt";
std::ifstream fin; fin.open(path, std::ios::in);
std::string str; while (getline(fin, str)) { #pragma omp critical q.push(str); }
fin.close(); ++ok; } else { while (q.size() || ok != 4) { std::string res; #pragma omp critical { if (q.size()) { res = q.front(); q.pop(); } } std::string word = ""; for (int i = 0; i < res.size(); ++i) { if (res[i] == ' ') { std::cout << word << ' '; word = ""; } else word += res[i]; } } } } return 0; }
|
运行方式
1 2
| g++ -o homework -fopenmp homework.cpp ./homework.exe
|