C++中如何对比两个OpenMP线程对数组执行位取反运算的输出是否一致
解决方法
核心思路
- 避免多线程并发打印导致输出乱序,为每个线程分配独立的存储空间存储计算结果
- 并行计算阶段仅做结果存储,不执行对比逻辑
- 所有线程执行完成后,在主线程中统一对比两个线程的输出结果
修改后的可运行代码
#include <iostream> #include <omp.h> #include <bitset> #include <vector> using namespace std; // 你的代码中bitset长度M按输出示例定义为8 #define M 8 int main() { omp_set_num_threads(2); char array[6]={1,0,1,0,1,0}; // 分别存储线程0和线程1的计算结果 vector<string> res0, res1; #pragma omp parallel { int tid = omp_get_thread_num(); // 每个线程将计算结果存入对应容器 for (int i=0; i<sizeof(array); i++) { bitset<M> bitarray(array[i]); if (tid == 0) { res0.push_back((~bitarray).to_string()); } else if (tid == 1) { res1.push_back((~bitarray).to_string()); } } } // 主线程串行执行打印和对比逻辑 cout << "线程0的计算结果:" << endl; for (auto &s : res0) cout << s << " "; cout << endl << endl; cout << "线程1的计算结果:" << endl; for (auto &s : res1) cout << s << " "; cout << endl << endl; // 逐位对比结果 bool is_same = true; if (res0.size() != res1.size()) { is_same = false; } else { for (int i=0; i<res0.size(); i++) { if (res0[i] != res1[i]) { is_same = false; break; } } } if (is_same) { cout << "两个线程的输出结果完全一致" << endl; } else { cout << "两个线程的输出结果不一致" << endl; } return 0; }
额外说明
- 你当前代码中使用
~bitset<M>是对M个比特位全部取反,所以输入1得到的是11111110,输入0得到的是11111111,和你预期的单比特0/1互换有差异,如果要实现单比特转换可以修改为bitset<1>或者直接用1 - array[i]的数值运算实现。 - 多线程场景下不要在并行块内无同步的打印内容,否则会出现多个线程输出穿插乱序的问题,无法直接对比打印结果。
内容的提问来源于stack exchange,提问作者user17057456
相关产品推荐
相关产品推荐

