如何从并行循环打印

问题描述 投票:0回答:1

如何通过 OpenMP 并行执行循环打印?我希望避免关键代码或类似的代码(我听说)确实会减慢执行速度。

额外的复杂性:似乎在我运行代码的集群计算机上,我只能从主线程(id = 0)进行打印。所以我尝试了以下代码。它基本上可以工作,但是当一个进程向

stringstream
写入数据,同时主进程读取它时,可能会导致异常行为。

#include <iostream>
#include <vector>
#include <omp.h>
#include <sstream>
using namespace std;

int main() {
  int nthreads=10;
  omp_set_num_threads(nthreads);
  vector<stringstream> ss(nthreads);
  #pragma omp parallel for schedule(static,1)
  for(unsigned int i= 1; i<=100000;i++){
    int id=omp_get_thread_num();
    if(id==0){
      for(int idi=0;idi<nthreads;idi++)
        if(ss[idi].tellp()>ss[idi].tellg()) cout<<ss[idi].rdbuf();
    }
    // DO WORK,
    if(some condition) ss[id]<< some outcome...
    // MORE WORK
    ss[id]<< more outcome
  }
  return 0;
}
c++ parallel-processing openmp
1个回答
0
投票

std::stringstream
不是线程安全的。您必须跨线程序列化对其的并发访问,例如使用
std::mutex

© www.soinside.com 2019 - 2024. All rights reserved.