如何通过 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;
}
std::stringstream
不是线程安全的。您必须跨线程序列化对其的并发访问,例如使用 std::mutex
。